Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
GDI+ stellt die Image und Bitmap Klassen zum Speichern und Bearbeiten von Bildern bereit. Image und Bitmap Objekte speichern die Farbe der einzelnen Pixel als 32-Bit-Zahl: 8 Bit jeweils für Rot, Grün, Blau und Alpha. Jede der vier Komponenten ist eine Zahl zwischen 0 und 255, wobei 0 keine Intensität und 255 die volle Intensität darstellt. Die Alphakomponente gibt die Transparenz der Farbe an: 0 ist vollständig transparent, und 255 ist vollständig undurchsichtig.
Ein Farbvektor ist ein 4-Tupel des Formulars (Rot, Grün, Blau, Alpha). Beispielsweise stellt der Farbvektor (0, 255, 0, 255) eine undurchsichtige Farbe dar, die kein Rot oder Blau aufweist, aber grün in voller Intensität aufweist.
Eine weitere Konvention für die Darstellung von Farben verwendet die Zahl 1 für die volle Intensität. Bei Verwendung dieser Konvention würde die im vorherigen Absatz beschriebene Farbe durch den Vektor dargestellt (0, 1, 0, 1). GDI+ verwendet die Konvention von 1 als volle Intensität, wenn sie Farbtransformationen durchführt.
Sie können lineare Transformationen (Drehung, Skalierung und ähnliches) auf Farbvektoren anwenden, indem Sie die Farbvektoren mit einer 4×4-Matrix multiplizieren. Sie können jedoch keine 4×4-Matrix verwenden, um eine Übersetzung durchzuführen (nichtlinear). Wenn Sie eine dumme fünfte Koordinate (z. B. die Zahl 1) zu jedem der Farbvektoren hinzufügen, können Sie eine 5×5-Matrix verwenden, um eine beliebige Kombination von linearen Transformationen und Übersetzungen anzuwenden. Eine Transformation, die aus einer linearen Transformation besteht, gefolgt von einer Übersetzung, wird als affine Transformation bezeichnet.
Angenommen, Sie möchten mit der Farbe (0.2, 0.0, 0.4, 1.0) beginnen und die folgenden Transformationen anwenden:
Doppeltippen der roten Komponente
Hinzufügen von 0,2 zu den roten, grünen und blauen Komponenten
Die folgende Matrixmultiplikation führt das Transformationspaar in der aufgeführten Reihenfolge aus.
Die Elemente einer Farbmatrix werden nach Zeile und spalte indiziert (nullbasiert). Beispielsweise wird der Eintrag in der fünften Zeile und der dritten Spalte der Matrix M
durch M[4][2]
angegeben.
Die 5×5-Identitätsmatrix (in der folgenden Abbildung dargestellt) hat 1 auf der Diagonale und 0s überall sonst. Wenn Sie einen Farbvektor mit der Identitätsmatrix multiplizieren, ändert sich der Farbvektor nicht. Eine bequeme Möglichkeit, die Matrix einer Farbtransformation zu bilden, besteht darin, mit der Identitätsmatrix zu beginnen und eine kleine Änderung vorzunehmen, die die gewünschte Transformation erzeugt.
Ausführlichere Erläuterungen zu Matrizen und Transformationen finden Sie unter "Koordinatensysteme und Transformationen".
Beispiel
Im folgenden Beispiel wird ein Bild verwendet, das alle eine Farbe (0,2, 0,0, 0,4, 1.0) aufweist und die in den vorherigen Absätzen beschriebene Transformation anwendet.
Die folgende Abbildung zeigt das ursprüngliche Bild auf der linken Seite und das transformierte Bild auf der rechten Seite.
Der Code im folgenden Beispiel verwendet die folgenden Schritte zum Neufärben:
Initialisieren eines ColorMatrix Objekts.
Erstellen Sie ein ImageAttributes Objekt, und übergeben Sie das ColorMatrix Objekt an die SetColorMatrix Methode des ImageAttributes Objekts.
Übergeben Sie das ImageAttributes Objekt 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);
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)
Code kompilieren
Das vorangehende Beispiel wurde für die Verwendung mit Windows Forms entwickelt und erfordert PaintEventArgse
, bei dem es sich um einen Parameter des Paint-Ereignishandlers handelt.
Siehe auch
.NET Desktop feedback