Freigeben über


Verwenden von Transformationen zum Skalieren von Farben

Eine Skalierungstransformation multipliziert eine oder mehrere der vier Farbkomponenten um eine Zahl. Die Farbmatrixeinträge, die Skalierung darstellen, werden in der folgenden Tabelle angegeben.

Komponente, die skaliert werden soll Matrixeintrag
Rot [0][0]
Grün [1][1]
Blau [2][2]
Alpha [3][3]

Skalieren einer Farbe

Im folgenden Beispiel wird ein Image-Objekt aus der Datei ColorBars2.bmperstellt. Anschließend skaliert der Code die blaue Komponente jedes Pixels im Bild um den Faktor 2. Das Originalbild wird neben dem transformierten Bild gezeichnet.

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

Die folgende Abbildung zeigt das originale Bild auf der linken Seite und das skalierte Bild auf der rechten Seite:

Screenshot, der die ursprünglichen und skalierten Farben vergleicht.

In der folgenden Tabelle sind die Farbvektoren für die vier Balken vor und nach der blauen Skalierung aufgeführt. Beachten Sie, dass die blaue Komponente im vierten Farbbalken von 0,8 auf 0,6 ging. Das liegt daran, dass GDI+ nur den Bruchteil des Ergebnisses beibehält. Beispiel: (2)(0,8) = 1,6 und der Bruchteil von 1,6 ist 0,6. Durch die Beibehaltung nur des Bruchteils wird sichergestellt, dass das Ergebnis immer im Intervall [0, 1] liegt.

Original Skaliert
(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 ein Image-Objekt aus der Datei ColorBars2.bmperstellt. Anschließend skaliert der Code die roten, grünen und blauen Komponenten der einzelnen Pixel im Bild. Die roten Komponenten werden um 25 Prozent verkleinert, die grünen Komponenten werden um 35 Prozent verkleinert, und die blauen Komponenten werden um 50 Prozent verkleinert.

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

Die folgende Abbildung zeigt das originale Bild auf der linken Seite und das skalierte Bild auf der rechten Seite:

Screenshot, der die ursprünglichen und skalierten roten, grünen und blauen Komponenten vergleicht.

In der folgenden Tabelle sind die Farbvektoren für die vier Balken vor und nach der roten, grünen und blauen Skalierung aufgeführt.

Original Skaliert
(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