Pixel Farbe

Hallo Experten!

Mal wieder eine Frage meinerseits:

Wie kann ich aus einem Bild die Fabe eines bestimmten Pixels auslesen?
z.B. brauche ich die Farbe des Pixels 390/350

Vielen Dank im Vorraus

Rodario

Hallo Rodario,

Wie kann ich aus einem Bild die Fabe eines bestimmten Pixels
auslesen?
z.B. brauche ich die Farbe des Pixels 390/350

mit Point. Das ist mal wieder abhängig vom Steuerelement, meist wird das wohl ein Picture sein.

 Dim Farbe As Long
 Dim x As Integer
 Dim y As Integer
 Farbe = Picture1.Point(x, y)

Gruß, Rainer

Hallo Rainer!

Das ging aber shnell!

Danke
Radario

Hallo Rodario,

das kannst du auch via der API GetPixel.
Musst aber aufpassen.Handlet es sich um eine Systemfarbe, so musst du sie noch umwandeln.

Ansonsten bekommst du die einzelnen Anteile (Rot/Gruen/Blau) via

RotAnteil = OriginalPixelFarbe Mod 256
GruenAnteil = (OriginalPixelFarbe \ 256) Mod 256
BlauAnteil = OriginalPixelFarbe \ 256 \ 256

oder Alternativ

RotAnteil= OriginalPixelFarbe And vbRed
GruenAnteil= (OriginalPixelFarbe And vbGreen) \ &h100
BlauAnteil= (OriginalPixelFarbe And vbBlue) \ &h10000

Man sollte halt nur wissen das die gemischte Farbe unter VB ( wenn sie als Long vorliegt) in der Form &HBBGGRR vorliegen :wink:

Noch einmal schnell zu der Thematik Systemfarbe :smile: ( ich hab grad langeweile :smile: )

Am besten ist es, vorher zu prüfen ob es sich um eine Systemfarbe handelt. Wenn ja, dann wandle sie um und lasse dir danach die Farben zurueckgeben. wenn nicht, dann eben gleich die Farben zurueckgeben lassen. Aber nun fragst du dich sicherlich wie du herausbekommst ob es sich um eine Systemfarbe handelt. Nun das ist ganz einfach!
Ist die Farbe and &H80000000 = True so handelt es sich um eine Systemfarbe :smile:

Praktisch gesehen, würde das so ausschauen

Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long


Public Sub GetColor(Farbe as long)
If Farbe And &H80000000 Then
 GetFarbe = GetSysColor(Color And &H7FFFFFFF)
Else
 GetFarbe Color
End If
End Sub

Private Sub GetFarbe(Color as Long)
 msgbox "Die Anteile der Farbe: " & Color & " sind" & vbnewline & "Rot: " & Color And vbRed & vbnewline & "Gruen: " & (Color And vbGreen) \ &h100 & vbnewline & "Blau: " & (Color And vbBlue) \ &h10000
End sub

MfG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,
picturebox.point(x,y) ist aber deutlich langsamer als die Variante, die von „anno74“ vorgestellt wurde!

–> mit point(x,y) könnte man auch die Farbe setzen, nicht nur auslesen (wenn ich das richtig im Kopf habe), das geht aber mit der WindowsAPI deutlich schneller.

Gruß,
AlexR

Hallo,

picturebox.point(x,y) ist aber deutlich langsamer als die
Variante, die von „anno74“ vorgestellt wurde!

ja, klar. Aber für einen einzelnen Pixel würde ich trotzdem die einfache Variante wählen.

–> mit point(x,y) könnte man auch die Farbe setzen,

Nein, das wäre dann PSet(x,y)

nicht
nur auslesen (wenn ich das richtig im Kopf habe), das geht
aber mit der WindowsAPI deutlich schneller.

Natürlich. Es kommt eben immer darauf an, was man vor hat, wie viel gelesen werden soll, wie zeitkritisch die Anwendung ist …
Wenn ganze Bereiche verglichen werden sollen, kann man die ausschneiden, in ein Bytearray schieben … Es gibt immer mehrere Möglichkeiten, für manche Anwendungen gibt es dann eine Beste. :smile:

Gruß, Rainer