Rubrik: Grafik und Font · Grafische Effekte | VB-Versionen: VB2008 | 17.07.08 |
Farbkomponenten eines Bildes ändern (A-R-G-B-Modell) Die Ausprägung der Farb-Komponenten Rot-Grün-Blau in einem Bild wird durch eine 'ColorMatrix' modifiziert. | ||
Autor: Manfred Bohn | Bewertung: | Views: 11.702 |
ohne Homepage | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
In Visual Basic werden Farben im A-R-G-B-Farbmodell verarbeitet. Um die Anteile der einzelnen Komponenten einer Farbe zu ändern, kann das Bild (das in einer Instanz der Bitmap-Klasse enthalten ist) neu gezeichnet werden (durch die Methode 'Graphics.Drawimage').
Dabei sind die Modifikationen der Farbanteile in Form einer Instanz der 'ImageAttributes'-Klasse vorzugeben, der eine entsprechend aufgebaute 'ColorMatrix' zugewiesen worden ist. Diese Matrix wird mit dem Vektor der Farbwerte eines Pixels multipliziert und das Ergebnis als neue Pixelfarbe aufbereitet.
Das klingt ein wenig kompliziert, ist aber recht einfach zu handhaben.
Die als Erweiterungsmethode der Bitmap-Klasse konzipierte Routine 'Adjust_ARGB' erwartet als (optionale) Parameter die Angaben zur Änderung der einzelnen Komponenten.
Die Routine muss in ein Modul eingetragen werden, damit sie als 'Extension' funktioniert.
Falls eine Komponente nicht geändert werden soll, ist im zugehörigen Parameter der Wert 0 ( = Voreinstellung) anzugeben. Die Parameter sollen im Bereich -0,5 bis +0,5 liegen. Negative Werte senken den entsprechenden Anteil, positive erhöhen ihn. Bereits kleine Nullabweichungen in diesen Parametern können erhebliche Auswirkungen auf das zurückgegebene Bild haben.
Falls ein Fehler auftritt, gibt diese Routine 'Nothing' zurück.
Die gleichmäßige Änderung von Red, Green, und Blue führt im Ergebnis zu einer Helligkeitsänderunmg des Bildes.
Die Auswirkung der Parameter auf die Farbkomponenten veranschaulicht die Umrechnungstabelle.
Parameter Farbwert-Änderung
0 0
+0.05 +13
+0,1 +26
+0.2 +51
+0.3 +77
Die Routine 'DrawImage' verarbeitet die 'ColorMatrix' in diesem Fall sinnvollerweise so, dass berechnete Farb-Werte über 255 auf 255 gesetzt werden (bzw. Farbwerte unter 0 auf 0).
Das ist offensichtlich nicht bei allen Formen der ColorMatrix so!
Verändert man die Hauptdiagonale (proportionale Änderung) wird z.B. bei Werten über 255 das Ergebnis: Wert - 255. Der daraus resultierende Umklapp-Effekt bei intensiven Farben ist in den meisten Fällen wohl unbrauchbar (ermittelt durch: VB2008 Express Edition).
''' <summary> ''' Anpassung der A-R-G-B-Werte eines Bildes ''' </summary> ''' <param name="bmp_in">Das zu ändernde Bild</param> ''' <param name="adj_alpha">Modifikation Alpha-Kanal </param> ''' <param name="adj_red">Modifikation Rotanteil ''' (-0,5 bis +0,5)</param> ''' <param name="adj_green">Modifikation Grünanteil ''' (-0,5 bis +0,5)</param> ''' <param name="adj_blue">Modifikation Blauanteil ''' (-0,5 bis +0,5)</param> ''' <returns>Das geänderte Bild, sonst Nothing</returns> <System.Runtime.CompilerServices.Extension()> _ Public Function Adjust_ARGB(ByVal bmp_in As Bitmap, _ Optional ByVal adj_alpha As Single = 0, _ Optional ByVal adj_red As Single = 0, _ Optional ByVal adj_green As Single = 0, _ Optional ByVal adj_blue As Single = 0, _ Optional ByVal Version As Integer = 1) As Drawing.Bitmap Try If IsNothing(bmp_in) Then Return Nothing If Math.Abs(adj_red) > 1 Then adj_red = 0 If Math.Abs(adj_green) > 1 Then adj_green = 0 If Math.Abs(adj_blue) > 1 Then adj_blue = 0 ' R-G-B Farbanteile des Bildes ändern Dim cm(0)() As Single ' Farb-Transformationsmatrix erstellen Color_Matrix(adj_alpha, adj_red, adj_green, adj_blue, cm) Dim colMat As New Drawing.Imaging.ColorMatrix(cm) ' Colormatrix als Farbattribut setzen Dim imgattr As New Drawing.Imaging.ImageAttributes() imgattr.SetColorMatrix(colMat, _ Drawing.Imaging.ColorMatrixFlag.Default, _ Drawing.Imaging.ColorAdjustType.Bitmap) ' Rückgabe-Bild erstellen Dim bmp_out As Drawing.Bitmap = CType(bmp_in.Clone, Drawing.Bitmap) Dim g As Drawing.Graphics = Drawing.Graphics.FromImage(bmp_out) Dim rect As New Drawing.Rectangle(0, 0, bmp_out.Width, bmp_out.Height) ' Bild neu zeichnen g.DrawImage(bmp_in, rect, 0, 0, bmp_in.Width, bmp_in.Height, _ GraphicsUnit.Pixel, imgattr) g.Dispose() : imgattr.Dispose() Return bmp_out Catch Return Nothing End Try End Function
Private Sub Color_Matrix(ByVal adj_alpha As Single, _ ByVal adj_red As Single, _ ByVal adj_green As Single, _ ByVal adj_blue As Single, _ ByRef cm()() As Single) ' Erstellung einer Farbmatrix für die ' Änderung der Farbwerte eines Pixels ' (separate, additive Anpassung jedes einzelnen ' Farbanteils) ' Einheitsmatrix erstellen ReDim cm(4) For i As Integer = 0 To 4 ReDim cm(i)(4) cm(i)(i) = 1 Next i ' Parameterwerte in Colormatrix eintragen ' (Die Reihenfolge muss stimmen!!) cm(4)(0) = adj_red cm(4)(1) = adj_green cm(4)(2) = adj_blue cm(4)(3) = adj_alpha End Sub