Freigeben über


Skalieren von Farben

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]

Im folgenden Beispiel wird ein Image-Objekt aus der Datei ColorBars2.bmp 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 = 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)
[C#]
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)

Im folgenden Beispiel wird ein Image-Objekt aus der Datei ColorBars2.bmp 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 = 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)
[C#]
Image image = new Bitmap("ColorBars.bmp");
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = { 
   new float[] {.75,  0,  0,  0, 0},
   new float[] {0,  .65,  0,  0, 0},
   new float[] {0,  0,  .5,  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 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)