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. 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 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 Dieser Tipp wurde bereits 12.092 mal aufgerufen.
Anzeige
![]() ![]() ![]() Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
vb@rchiv CD Vol.6 ![]() ![]() Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats ![]() Manfred Bohn IndexOf für mehrdimensionale Arrays Die generische Funktion "IndexOf" ermittelt das erste Auftreten eines bestimmten Wertes in einem n-dimensionalen Array sevOutBar 4.0 ![]() Vertikale Menüleisten á la Outlook Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |