Rubrik: Grafik und Font · Sonstiges | VB-Versionen: VB4, VB5, VB6 | 01.03.04 |
Point-Funktion für das Image-Control Das Image-Control verfügt im Gegensatz zum Picturebox-Control über keine Point-Funktion. Mit ein wenig API-Einsatz läßt sich dieser Umstand beheben. | ||
Autor: Zardoz | Bewertung: | Views: 13.628 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Das Image-Control verfügt im Gegensatz zum Picturebox-Control über keine Point-Funktion, mit der man den Farbwert eines bestimmten Pixels auslesen kann.
Mit ein wenig API-Einsatz läßt sich dieser Umstand jedoch beheben.
Zunächst die benötigten API-Deklarationen:
Option Explicit ' Benötigte API-Deklarationen Private Declare Function CreateCompatibleDC Lib "gdi32" ( _ ByVal hdc As Long) As Long Private Declare Function SelectObject Lib "gdi32" ( _ ByVal hdc As Long, _ ByVal hObject As Long) As Long Private Declare Function GetPixel Lib "gdi32" ( _ ByVal hdc As Long, _ ByVal X As Long, _ ByVal Y As Long) As Long Private Declare Function DeleteDC Lib "gdi32" ( _ ByVal hdc As Long) As Long
Und hier die Funktion:
Private Function PointImage&(Img As Image, _ X As Single, Y As Single) Dim XPx AS long Dim YPx As long Dim Imghdc As Long Dim OldHnd As Long ' Umwandeln der Koordinaten in Pixel XPx = Me.ScaleX(X, Me.ScaleMode, vbPixels) YPx = Me.ScaleY(Y, Me.ScaleMode, vbPixels) ' Generieren eines DeviceContext (DC) Imghdc = CreateCompatibleDC(Me.hdc) ' Image-Bild dem DC zuordnen OldHnd = SelectObject(Imghdc, Img.Picture.Handle) ' Pixelfarbe auslesen PointImage = GetPixel(Imghdc, XPx, YPx) ' DC wieder den alten Handle zuordnen SelectObject Imghdc, OldHnd ' DC löschen DeleteDC Imghdc End Function
Ein Beispiel:
Benötigt werden: Ein Image-Control mit Bild und ein Label
Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Dim nRed As Integer Dim nGreen As Integer Dim nBlue As Integer Dim nColor As Long ' Farbe des Image-Controls auslesen nColor = PointImage(Image1, X, Y) ' Farbe in RGB zerlegen nRed = nColor And &HFF nGreen = (nColor \ &H100) And &HFF nBlue = (nColor \ &H10000) And &HFF ' Farbwerte im Label ausgeben Label1.AutoSize = True Label1.Caption = "Rot = " & CStr(nRed)& vbCr & _ "Grün = " & CStr(nGreen) & vbCr & _ "Blau = " & CStr(nBlue) End Sub
Anmerkung:
Wenn die Stretch-Eigenschaft des Image-Controls auf True festgelegt ist, müssen die X- und die Y-Koordinate vor dem Aufruf durch den Vergrößerungsfaktor geteilt werden. Dieser Faktor für die X-Koordinate ist das Verhältnis der Breite der Image ohne Rahmen, zur Breite des Originalbildes.