VB-Homepage Tipp 288

Long Wert in RGB Werte konvertieren
Farbe eines beliebigen Pixels ermitteln

Modifizierung Dezember 1998
Es gibt doch immer noch eine bessere, schnellere oder saubere Lösung, als die, die man bisher einsetzt. Und da dies so ist, hab ich auch keinerlei Probleme mich zu korrigieren bzw. die bessere Lösung zukünftig einzusetzen.
Und natürlich wird auch der Tipp in der Tipp-Datenbank dann modifiziert.

Hier soll es also eine Ergänzung zum Umrechnen (Aufsplitten) eines Long-Wertes in die RGB Werte geben.

Ausgegangen wird hier von einer PictureBox, von der der Longwert eines Pixels ermittelt wird, um diesen anschließend in die RGB Werte umzusetzen.

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim farbwert As Long

farbwert = Picture1.Point(X, Y)
Label1(0).Caption = farbwert And &HFF&
Label1(1).Caption = farbwert \ &H100& And &HFF&
Label1(2).Caption = farbwert \ &H10000 And &HFF&

End Sub


Originaltip
Sie können von jeder Form oder jedem PictureObjekt an der aktuellen Stelle, die aktive Farbe ermitteln. Dies geht sehr einfach in der MouseDown Methode, da dies die benötigten Koordinaten x ; y schon liefert.
Wenn Sie dann noch farbe = Picture1.Point(X, Y)  angeben,
besitzt die Variable farbe den Farbwert von Picture1 in Form eines Longwertes, den Sie auch so übergeben können.

Zum Beispiel   Form1.BackColor = farbe

Was aber, wenn Sie diesen ermittelten Farbwert wieder in RGB Angaben benötigen? Es gibt meines Wissens keine Funkiton, die dies wieder umwandelt.
(Für jeden Hinweis bin ich aber dankbar)

Da ich dies Funktion aber für ein kleines Programm benötigte,
mußte ich mir etwas einfallen lassen und habe mir den Aufbau
des Long Wertes etwas genauer angesehen.

Dabei fiel schnell auf, das die drei Grundbestandteile (RGB) sehr wohl getrennt behandelt werden und zwar in Form von gestaffelten Werten.
Sie wissen sicher, daß sich die RGB Werte von 0 bis 255 bewegen.

So ist zum Beispiel
255,255,255 = weiß und somit
0,0,0 = schwarz.

Der Long Wert setzt sich wie folgt zusammen.

R    =    Werte zwischen 0 bis 255
G    =    Werte zwischen 256 bis 65280
B    =    Werte zwischen 65536 bis 16711680

So das der höchste Wert einer Farbe nie größer sein kann als der niedrigste Wert der nächsten Farbe. Und mit diesem Wissen läßt sich nun auch der entsprechende Farbanteil wieder ermitteln und dann in RGB Syntax angeben.
Hier die Vorgehensweise.

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim farbe As Long
Dim wert1, wert2, wert3 As Integer

On Error Resume Next

' falls Wert kleiner 1, wird 0 gesetzt
wert3 = 0
wert2 = 0
wert1 = 0

'Ermitteln der Farbe an den aktuellen X,Y Koordinaten (hier Picture1) als Long
farbe = Picture1.Point(X, Y)

'Umwandeln in RGB Angaben
If farbe >= 65536 Then wert3 = Int(farbe / 65536)
If farbe >= 256 Then wert2 = Int((farbe - (wert3 * 65536)) / 256)
If farbe > 0 Then wert1 = Int(farbe - (wert3 * 65536) - (wert2 * 256))

'Zuweisung als RGB Wert (hier einfach Anzeige der einzelnen Werte als Text)
Label1.Caption = wert1
Label2.Caption = wert2
Label3.Caption = wert3

Wem nicht so recht der Sinn einleuchten will, warum es notwendig sein kann, die einzelnen Werte wieder zu ermitteln (schließlich kann man die Farbe auch als Long Wert übergeben), der sollte sich mal im Tipp Transparente Grafiken ohne API das im Download enthaltene Programm ansehen, mit dem sich die Masken erstellen lassen, dort werden die ermittelten RGB Werte den drei Scrollbalken für die einzelnen Grundbestandteile (RGB) übergeben.


Tipp-Download

Quelle für Tippmodifizierung : Basicworld Autor : M.Schiffer

Zurück zur Übersichtsseite