Skalieren von Farben mithilfe von Transformationen
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] |
Skalierung einer Farbe
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 = 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)
In der folgenden Abbildung wird links das ursprüngliche Bild und rechts das skalierte Bild gezeigt:
In der folgenden Tabelle sind die Farbvektoren für die vier Balken vor und nach der Blue-Skalierung aufgeführt. 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) |
Skalieren mehrerer Farben
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 = 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)
In der folgenden Abbildung wird links das ursprüngliche Bild und rechts das skalierte Bild gezeigt:
In der folgenden Tabelle sind die Farbvektoren für die vier Balken vor und nach der Red-, Green- und Blue-Skalierung aufgeführt.
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) |
Siehe auch
.NET Desktop feedback