Gewusst wie: Verwenden einer Farbmatrix zum Transformieren einer Farbe

Aktualisiert: November 2007

GDI+ stellt die Image-Klasse und die Bitmap-Klasse zum Speichern und Bearbeiten von Bildern bereit. Das Image-Objekt und das Bitmap-Objekt speichern die Farbe jedes Pixels als 32-Bits-Zahl: jeweils 8 Bits für Rot, Grün, Blau und Alpha. Jeder der vier Anteile entspricht einer Zahl von 0 bis 255, wobei 0 für keine Intensität und 255 für volle Farbintensität steht. Durch den Alphaanteil wird die Transparenz der Farbe angegeben: 0 entspricht vollständiger Transparenz und 255 vollständiger Deckung.

Ein Farbvektor ist ein Vierfachwert in der Form (Rot, Grün, Blau, Alpha). Der Farbvektor (0, 255, 0, 255) stellt beispielsweise eine nicht transparente Farbe ohne Rot oder Blau, jedoch mit voller Grünintensität dar.

Gemäß einer anderen Farbdarstellungskonvention wird für volle Intensität die Ziffer 1 verwendet. Entsprechend dieser Konvention würde die im vorherigen Abschnitt beschriebene Farbe durch den Vektor (0, 1, 0, 1) dargestellt werden. Die auf dem Wert 1 basierende Konvention wird in GDI+ bei der Durchführung von Farbtransformationen für volle Intensität verwendet.

Sie können lineare Transformationen (Drehung, Skalierung u. ä.) auf Farbvektoren anwenden, indem Sie die Farbvektoren mit einer 4x4-Matrix multiplizieren. Für Verschiebungen (nicht linear) kann jedoch keine 4x4-Matrix verwendet werden. Wenn Sie jedem Farbvektor eine fünfte Koordinate (z. B. die Ziffer 1) als Dummy hinzufügen, können Sie mit einer 5x5-Matrix eine Kombination aus linearen Transformationen und Verschiebungen anwenden. Eine Transformation, die aus einer linearen Transformation besteht, auf die eine Verschiebung folgt, wird als affine Transformation bezeichnet.

Angenommen, Sie möchten z. B. ausgehend von der Farbe (0.2, 0.0, 0.4, 1.0) die folgenden Transformationen anwenden:

  1. Verdoppelung des Rotanteils

  2. Erhöhung des Rot-, Grün- und Blauanteils um den Wert 0.2

Durch die folgende Matrixmultiplikation werden die beiden Transformationen in der gezeigten Reihenfolge ausgeführt.

Die Elemente einer Farbmatrix sind erst nach Zeile und anschließend nach Spalte indiziert (nullbasiert). Der Eintrag in der fünften Zeile und der dritten Spalte von Matrix "M" wird z. B. durch M[4][2] dargestellt.

Die 5x5-Identitätsmatrix (siehe folgende Abbildung) verfügt in der Diagonalen über Einsen und ansonsten lediglich über Nullen. Wird ein Farbvektor mit der Identitätsmatrix multipliziert, bleibt der Farbvektor unverändert. Die beste Möglichkeit, die Matrix einer Farbtransformation zu bilden, besteht darin, ausgehend von der Identitätsmatrix eine geringfügige Änderung vorzunehmen, durch die die gewünschte Transformation erzielt wird.

Detailliertere Ausführungen zu Matrizen und Transformationen finden Sie unter Koordinatensysteme und Transformationen.

Beispiel

Im folgenden Beispiel wird die in den vorangehenden Abschnitten beschriebene Transformation auf ein komplett einfarbiges Bild (0.2, 0.0, 0.4, 1.0) angewendet.

In der folgenden Abbildung ist das ursprüngliche Bild auf der linken und das transformierte Bild auf der rechten Seite zu sehen.

Im Code aus dem nachstehenden Beispiel werden die folgenden Schritte ausgeführt, um das Bild neu einzufärben:

  1. Initialisieren eines ColorMatrix-Objekts.

  2. Erstellen eines ImageAttributes-Objekts und Übergeben des ColorMatrix-Objekts an die SetColorMatrix-Methode des ImageAttributes-Objekts.

  3. Übergeben des ImageAttributes-Objekts an die DrawImage-Methode eines Graphics-Objekts.

Dim image As New Bitmap("InputColor.bmp")
Dim imageAttributes As New ImageAttributes()
Dim width As Integer = image.Width
Dim height As Integer = image.Height

' The following matrix consists of the following transformations:
' red scaling factor of 2
' green scaling factor of 1
' blue scaling factor of 1
' alpha scaling factor of 1
' three translations of 0.2
Dim colorMatrixElements As Single()() = { _
   New Single() {2, 0, 0, 0, 0}, _
   New Single() {0, 1, 0, 0, 0}, _
   New Single() {0, 0, 1, 0, 0}, _
   New Single() {0, 0, 0, 1, 0}, _
   New Single() {0.2F, 0.2F, 0.2F, 0, 1}}

Dim colorMatrix As New ColorMatrix(colorMatrixElements)

imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)

e.Graphics.DrawImage(image, 10, 10)

e.Graphics.DrawImage( _
   image, _
   New Rectangle(120, 10, width, height), _
   0, _
   0, _
   width, _
   height, _
   GraphicsUnit.Pixel, _
   imageAttributes)

Image image = new Bitmap("InputColor.bmp");
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = { 
   new float[] {2,  0,  0,  0, 0},        // red scaling factor of 2
   new float[] {0,  1,  0,  0, 0},        // green scaling factor of 1
   new float[] {0,  0,  1,  0, 0},        // blue scaling factor of 1
   new float[] {0,  0,  0,  1, 0},        // alpha scaling factor of 1
   new float[] {.2f, .2f, .2f, 0, 1}};    // three translations of 0.2

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

e.Graphics.DrawImage(image, 10, 10);

e.Graphics.DrawImage(
   image,
   new Rectangle(120, 10, width, height),  // destination rectangle 
   0, 0,        // upper-left corner of source rectangle 
   width,       // width of source rectangle
   height,      // height of source rectangle
   GraphicsUnit.Pixel,
   imageAttributes);

Kompilieren des Codes

Das vorhergehende Beispiel ist für die Verwendung mit Windows Forms konzipiert und erfordert PaintEventArgs e, einen Parameter des Paint-Ereignishandlers.

Siehe auch

Weitere Ressourcen

Neueinfärben von Bildern

Koordinatensysteme und Transformationen