vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2018
 
zurück
Rubrik: Grafik und Font · Grafische Effekte   |   VB-Versionen: VB200817.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 BohnBewertung:     [ Jetzt bewerten ]Views:  10.016 
ohne HomepageSystem:  Win2k, WinXP, Vista, Win7, Win8, Win10kein 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

Dieser Tipp wurde bereits 10.016 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2018 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel