(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

Gewusst wie: Verwenden einer Farbmatrix zum Transformieren einer Farbe

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-Bit-Zahl: jeweils 8 Bit 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 höchste 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.

Neueinfärbung

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.

Neueinfärbung

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

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.

Farben

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.


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);


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

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft