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 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
Noch einmal schnell zu der Thematik Systemfarbe ( ich hab grad langeweile
)
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
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.
Gruß, Rainer