Freigeben über


Skalieren von Farben mithilfe von Transformationen

Aktualisiert: November 2007

Durch die Skalierungstransformation wird einer oder mehrere der vier Farbanteile mit einer Zahl multipliziert. In der folgenden Tabelle sind die Farbmatrixeinträge aufgeführt, die eine Skalierung darstellen.

Zu skalierende Komponente

Matrixeintrag

Rot

[0][0]

Grün

[1][1]

Blau

[2][2]

Alpha

[3][3]

Skalieren einer Farbe

Im folgenden Beispiel wird aus der Datei ColorBars2.bmp ein Image-Objekt erstellt. Anschließend skaliert der Code den Blauanteil jedes Bildpixels mit dem Faktor 2. Das ursprüngliche Bild wird längsseits des transformierten Bildes gezeichnet.

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

Dim colorMatrixElements As Single()() = { _
   New Single() {1, 0, 0, 0, 0}, _
   New Single() {0, 1, 0, 0, 0}, _
   New Single() {0, 0, 2, 0, 0}, _
   New Single() {0, 0, 0, 1, 0}, _
   New Single() {0, 0, 0, 0, 1}}

Dim colorMatrix As New ColorMatrix(colorMatrixElements)

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

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

' Pass in the destination rectangle (2nd argument), the upper-left corner 
' (3rd and 4th arguments), width (5th argument),  and height (6th 
' argument) of the source rectangle.
e.Graphics.DrawImage( _
   image, _
   New Rectangle(150, 10, width, height), _
   0, 0, _
   width, _
   height, _
   GraphicsUnit.Pixel, _
   imageAttributes)

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

float[][] colorMatrixElements = { 
   new float[] {1,  0,  0,  0, 0},
   new float[] {0,  1,  0,  0, 0},
   new float[] {0,  0,  2,  0, 0},
   new float[] {0,  0,  0,  1, 0},
   new float[] {0, 0, 0, 0, 1}};

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

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

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

e.Graphics.DrawImage(
   image,
   new Rectangle(150, 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);

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

In der folgenden Tabelle sind die Farbvektoren für die vier Balken vor und nach der Blauskalierung aufgelistet. Beachten Sie, dass der Blauanteil im vierten Farbbalken von 0.8 auf 0.6 verringert wurde. Dies liegt daran, dass in GDI+ lediglich die Nachkommastellen des Ergebnisses berücksichtigt werden. Beispiel: (2)(0.8) = 1.6, und die Nachkommastelle von 1.6 ist 0.6. Indem nur die Nachkommastellen beibehalten werden, ist gewährleistet, dass sich das Ergebnis immer im Intervall [0, 1] befindet.

Original

Skalierung

(0.4, 0.4, 0.4, 1)

(0.4, 0.4, 0.8, 1)

(0.4, 0.2, 0.2, 1)

(0.4, 0.2, 0.4, 1)

(0.2, 0.4, 0.2, 1)

(0.2, 0.4, 0.4, 1)

(0.4, 0.4, 0.8, 1)

(0.4, 0.4, 0.6, 1)

Skalieren mehrerer Farben

Im folgenden Beispiel wird aus der Datei ColorBars2.bmp ein Image-Objekt erstellt. Anschließend wird durch den Code der Rot-, Grün- und Blauanteil jedes Bildpixels skaliert. Die Skalierung hat folgendes Ergebnis: Die Rotanteile werden um 25 Prozent, die Grünanteile um 35 Prozent und die Blauanteile um 50 Prozent herabgestuft.

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

Dim colorMatrixElements As Single()() = { _
   New Single() {0.75F, 0, 0, 0, 0}, _
   New Single() {0, 0.65F, 0, 0, 0}, _
   New Single() {0, 0, 0.5F, 0, 0}, _
   New Single() {0, 0, 0, 1, 0}, _
   New Single() {0, 0, 0, 0, 1}}

Dim colorMatrix As New ColorMatrix(colorMatrixElements)

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

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

' Pass in the destination rectangle, and the upper-left corner, width, 
' and height of the source rectangle as in the previous example.
e.Graphics.DrawImage( _
   image, _
   New Rectangle(150, 10, width, height), _
   0, 0, _
   width, _
   height, _
   GraphicsUnit.Pixel, _
   imageAttributes)

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

float[][] colorMatrixElements = { 
   new float[] {.75F,  0,  0,  0, 0},
   new float[] {0,  .65F,  0,  0, 0},
   new float[] {0,  0,  .5F,  0, 0},
   new float[] {0,  0,  0,  1F, 0},
   new float[] {0, 0, 0, 0, 1F}};

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

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

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

e.Graphics.DrawImage(
   image,
   new Rectangle(150, 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);

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

In der folgenden Tabelle sind die Farbvektoren für die vier Balken vor und nach der Rot-, Grün- und Blauskalierung aufgelistet.

Original

Skalierung

(0.6, 0.6, 0.6, 1)

(0.45, 0.39, 0.3, 1)

(0, 1, 1, 1)

(0, 0.65, 0.5, 1)

(1, 1, 0, 1)

(0.75, 0.65, 0, 1)

(1, 0, 1, 1)

(0.75, 0, 0.5, 1)

Siehe auch

Referenz

ColorMatrix

ImageAttributes

Weitere Ressourcen

Grafik und Zeichnen in Windows Forms

Neueinfärben von Bildern