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 11.683 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 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. |
sevAniGif (VB/VBA) Anzeigen von animierten GIF-Dateien Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
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. |