Vorgehensweise: Verwenden einer Farbmatrix zum Festlegen von Alphawerten in Bildern

Die Bitmap-Klasse (die von der Image-Klasse erbt) und die ImageAttributes-Klasse bieten Funktionen zum Abrufen und Festlegen von Pixelwerten. Sie können die ImageAttributes-Klasse verwenden, um die Alphawerte für ein ganzes Bild zu ändern, oder Sie können die SetPixel-Methode der Bitmap-Klasse aufrufen, um einzelne Pixelwerte zu ändern.

Beispiel

Die Klasse ImageAttributes umfasst viele Eigenschaften, mit denen Sie Bilder während des Renderns verändern können. Im folgenden Beispiel wird ein ImageAttributes-Objekt verwendet, um alle Alphawerte auf 80 Prozent ihres ursprünglichen Werts festzulegen. Dazu wird eine Farbmatrix initialisiert und der Alpha-Skalierungswert in der Matrix auf 0,8 festgelegt. Die Adresse der Farbmatrix wird an die SetColorMatrix-Methode des ImageAttributes-Objekts übergeben, und das ImageAttributes-Objekt wird an die DrawString-Methode des Graphics-Objekts übergeben.

Beim Rendern werden die Alphawerte in der Bitmap auf 80 Prozent ihres ursprünglichen Werts reduziert. Das Ergebnis ist ein Bild, das mit dem Hintergrund verschmilzt. Wie die folgende Abbildung zeigt, wirkt das Bitmapbild transparent, Sie können die einfarbige schwarze Linie durch das Bild sehen.

Screenshot of alpha blending using a matrix.

Dort, wo sich das Bild über dem weißen Bereich des Hintergrunds befindet, wird es mit der Farbe Weiß gemischt. Dort, wo das Bild die schwarze Linie kreuzt, wird das Bild mit der Farbe Schwarz gemischt.

// Create the Bitmap object and load it with the texture image.
Bitmap bitmap = new Bitmap("Texture.jpg");

// Initialize the color matrix.
// Note the value 0.8 in row 4, column 4.
float[][] matrixItems ={
   new float[] {1, 0, 0, 0, 0},
   new float[] {0, 1, 0, 0, 0},
   new float[] {0, 0, 1, 0, 0},
   new float[] {0, 0, 0, 0.8f, 0},
   new float[] {0, 0, 0, 0, 1}};
ColorMatrix colorMatrix = new ColorMatrix(matrixItems);

// Create an ImageAttributes object and set its color matrix.
ImageAttributes imageAtt = new ImageAttributes();
imageAtt.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

// First draw a wide black line.
e.Graphics.DrawLine(
   new Pen(Color.Black, 25),
   new Point(10, 35),
   new Point(200, 35));

// Now draw the semitransparent bitmap image.
int iWidth = bitmap.Width;
int iHeight = bitmap.Height;
e.Graphics.DrawImage(
   bitmap,
   new Rectangle(30, 0, iWidth, iHeight),  // destination rectangle
   0.0f,                          // source rectangle x
   0.0f,                          // source rectangle y
   iWidth,                        // source rectangle width
   iHeight,                       // source rectangle height
   GraphicsUnit.Pixel,
   imageAtt);
' Create the Bitmap object and load it with the texture image.
Dim bitmap As New Bitmap("Texture.jpg")

' Initialize the color matrix.
' Note the value 0.8 in row 4, column 4.
Dim matrixItems As Single()() = { _
   New Single() {1, 0, 0, 0, 0}, _
   New Single() {0, 1, 0, 0, 0}, _
   New Single() {0, 0, 1, 0, 0}, _
   New Single() {0, 0, 0, 0.8F, 0}, _
   New Single() {0, 0, 0, 0, 1}}

Dim colorMatrix As New ColorMatrix(matrixItems)

' Create an ImageAttributes object and set its color matrix.
Dim imageAtt As New ImageAttributes()
imageAtt.SetColorMatrix( _
   colorMatrix, _
   ColorMatrixFlag.Default, _
   ColorAdjustType.Bitmap)

' First draw a wide black line.
e.Graphics.DrawLine( _
   New Pen(Color.Black, 25), _
   New Point(10, 35), _
   New Point(200, 35))

' Now draw the semitransparent bitmap image.
Dim iWidth As Integer = bitmap.Width
Dim iHeight As Integer = bitmap.Height

' Pass in the destination rectangle (2nd argument) and the x _
' coordinate (3rd argument), x coordinate (4th argument), width _
' (5th argument), and height (6th argument) of the source rectangle.
e.Graphics.DrawImage( _
   bitmap, _
   New Rectangle(30, 0, iWidth, iHeight), _
   0.0F, _
   0.0F, _
   iWidth, _
   iHeight, _
   GraphicsUnit.Pixel, _
   imageAtt)

Kompilieren des Codes

Das obige Beispiel ist für die Verwendung in Windows Forms konzipiert und erfordert die PaintEventArgse-Klasse, die ein Parameter von PaintEventHandler ist.

Siehe auch