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