Gewusst wie: Scheren von Farben
Aktualisiert: November 2007
Beim Scheren wird ein Farbanteil um einen Wert verringert oder erhöht, der sich proportional zu einem anderen Farbanteil verhält. Beachten Sie beispielsweise die Transformation, bei der der Rotanteil um die Hälfte des Werts des Blauanteils vergrößert wird. Bei einer solchen Transformation würde die Farbe (0.2, 0.5, 1) zu (0.7, 0.5, 1) werden. Der Wert des neuen Rotanteils ergibt sich aus 0.2 + (1/2)(1) = 0.7.
Beispiel
Im folgenden Beispiel wird aus der Datei ColorBars4.bmp ein Image-Objekt erstellt. Anschließend wird im Code die im vorangehenden Abschnitt erläuterte Schertransformation auf jedes Bildpixel angewendet.
In der folgenden Abbildung ist das ursprüngliche Bild auf der linken und das Bild mit der Schertransformation auf der rechten Seite zu sehen.
In der folgenden Tabelle sind die Farbvektoren für die vier Balken vor und nach der Schertransformation aufgelistet.
Original |
Schertransformation |
---|---|
(0, 0, 1, 1) |
(0.5, 0, 1, 1) |
(0.5, 1, 0.5, 1) |
(0.75, 1, 0.5, 1) |
(1, 1, 0, 1) |
(1, 1, 0, 1) |
(0.4, 0.4, 0.4, 1) |
(0.6, 0.4, 0.4, 1) |
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() {1, 0, 0, 0, 0}, _
New Single() {0, 1, 0, 0, 0}, _
New Single() {0.5F, 0, 1, 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)
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[] {1, 0, 0, 0, 0},
new float[] {0, 1, 0, 0, 0},
new float[] {0.5f, 0, 1, 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);
Kompilieren des Codes
Das vorhergehende Beispiel ist für die Verwendung mit Windows Forms konzipiert und erfordert PaintEventArgse, einen Parameter des Paint-Ereignishandlers. Ersetzen Sie ColorBars.bmp durch einen für das System gültigen Bildnamen und Pfad.