Share via


Farben skalieren

Eine Skalierungstransformation multipliziert eine oder mehrere der vier Farbkomponenten mit einer Zahl. Die Farbmatrixeinträge, die die Skalierung darstellen, finden Sie in der folgenden Tabelle.

Zu skalierende Komponente Matrixeintrag
Red [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 die Blue-Komponente jedes Pixels im Bild um den Faktor 2. Das Originalbild wird neben dem transformierten Bild gezeichnet.

Image            image(L"ColorBars2.bmp");
ImageAttributes  imageAttributes;
UINT             width = image.GetWidth();
UINT             height = image.GetHeight();

ColorMatrix colorMatrix = {
   1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
   0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
   0.0f, 0.0f, 2.0f, 0.0f, 0.0f,
   0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
   0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
   
imageAttributes.SetColorMatrix(
   &colorMatrix, 
   ColorMatrixFlagsDefault,
   ColorAdjustTypeBitmap);
   
graphics.DrawImage(&image, 10, 10, width, height);

graphics.DrawImage(
   &image, 
   Rect(150, 10, width, height),  // destination rectangle 
   0, 0,        // upper-left corner of source rectangle 
   width,       // width of source rectangle
   height,      // height of source rectangle
   UnitPixel,
   &imageAttributes);

Die folgende Abbildung zeigt das Originalbild links und das skalierte Bild auf der rechten Seite.

Zeigt vier farbige Balken und dann dieselben Balken mit unterschiedlichen Farben an.

Die folgende Tabelle zeigt die Farbvektoren für die vier Balken vor und nach der Blauskalierung. Beachten Sie, dass die Blue-Komponente im vierten Farbbalken von 0,8 auf 0,6 gegangen ist. Das liegt daran, dass GDI+ nur den Bruchteil des Ergebnisses behält. Beispiel: (2)(0,8) = 1,6 und der Bruchteil von 1,6 ist 0,6. Wenn nur der Bruchteil beibehalten wird, ist sichergestellt, dass das Ergebnis immer im Intervall [0, 1] liegt.

Ursprünglich 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)

 

Im folgenden Beispiel wird ein Image-Objekt aus der Datei ColorBars2.bmp erstellt. Anschließend skaliert der Code die Red-, Green- und Blue-Komponenten jedes Pixels im Bild. Die Red-Komponenten werden um 25 % herunterskaliert, die Green-Komponenten werden um 35 % herunterskaliert, und die Blue-Komponenten werden um 50 % herunterskaliert.

Image            image(L"ColorBars.bmp");
ImageAttributes  imageAttributes;
UINT             width = image.GetWidth();
UINT             height = image.GetHeight();

ColorMatrix colorMatrix = {
   0.75f, 0.0f,  0.0f, 0.0f, 0.0f,
   0.0f,  0.65f, 0.0f, 0.0f, 0.0f,
   0.0f,  0.0f,  0.5f, 0.0f, 0.0f,
   0.0f,  0.0f,  0.0f, 1.0f, 0.0f,
   0.0f,  0.0f,  0.0f, 0.0f, 1.0f};
   
imageAttributes.SetColorMatrix(
   &colorMatrix, 
   ColorMatrixFlagsDefault,
   ColorAdjustTypeBitmap);
   
graphics.DrawImage(&image, 10, 10, width, height);

graphics.DrawImage(
   &image, 
   Rect(150, 10, width, height),  // destination rectangle 
   0, 0,        // upper-left corner of source rectangle 
   width,       // width of source rectangle
   height,      // height of source rectangle
   UnitPixel,
   &imageAttributes);

Die folgende Abbildung zeigt das Originalbild links und das skalierte Bild auf der rechten Seite.

Abbildung mit vier farbigen Balken, dann diese Balken mit unterschiedlichen Farben

Die folgende Tabelle zeigt die Farbvektoren für die vier Balken vor und nach der Rot-, Grün- und Blauskalierung.

Ursprünglich 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)