Gewusst wie: Verwenden des Mischmodus zum Steuern des Alphablendings

In manchen Situationen möchten Sie möglicherweise eine Offscreenbitmap erstellen, die über die folgenden Merkmale verfügt:

  • Farben mit Alphawerten unter 255.

  • Farben, für die beim Erstellen der Bitmap kein gegenseitiges Alphablending verwendet wird.

  • Bei Anzeige der fertigen Bitmap wird für die Bitmapfarben ein Alphablending mit den Hintergrundfarben auf dem Anzeigegerät ausgeführt.

Um eine solche Bitmap zu erstellen, legen Sie ein leeres Bitmap-Objekt an und erstellen dann auf der Grundlage dieser Bitmap ein Graphics-Objekt. Legen Sie den Mischmodus des Graphics-Objekts auf CompositingMode.SourceCopy fest.

Beispiel

Im folgenden Beispiel wird auf der Grundlage eines Bitmap-Objekts ein Graphics-Objekt erstellt. Im Code wird das Graphics-Objekt zusammen mit zwei halbtransparenten Pinseln (Alpha = 160) verwendet, um auf der Bitmap zu zeichnen. Eine rote und eine grüne Ellipse werden im Code durch halb transparente Pinsel ausgefüllt. Die grüne Ellipse überlappt zwar die rote Ellipse, wird jedoch nicht mit ihr gemischt, da als Mischmodus des Graphics-Objekts SourceCopy festgelegt ist.

Durch den Code wird die Bitmap zweimal auf dem Bildschirm gezeichnet: einmal auf einem weißen Hintergrund und ein weiteres Mal auf einem mehrfarbigen Hintergrund. Die Pixel in der Bitmap, die zu den beiden Ellipsen gehören, haben einen Alphaanteil von 160. Die Ellipsen werden deshalb mit den Hintergrundfarben auf dem Bildschirm gemischt.

Die folgende Abbildung zeigt die Ausgabe des Codebeispiels. Beachten Sie, dass die Ellipsen zwar mit dem Hintergrund, nicht aber untereinander gemischt werden.

Quellkopie

Das Codebeispiel enthält die folgende Anweisung:

        bitmapGraphics.CompositingMode = CompositingMode.SourceCopy

bitmapGraphics.CompositingMode = CompositingMode.SourceCopy;

Wenn die Ellipsen sowohl untereinander als auch mit dem Hintergrund gemischt werden sollen, ändern Sie diese Anweisung wie folgt:

        bitmapGraphics.CompositingMode = CompositingMode.SourceOver

bitmapGraphics.CompositingMode = CompositingMode.SourceOver;

In der folgenden Abbildung ist das Ergebnis des geänderten Codes dargestellt.

Quelle stationär

        ' Create a blank bitmap.
        Dim myBitmap As New Bitmap(180, 100)

        ' Create a Graphics object that we can use to draw on the bitmap.
        Dim bitmapGraphics As Graphics = Graphics.FromImage(myBitmap)

        ' Create a red brush and a green brush, each with an alpha value of 160.
        Dim redBrush As New SolidBrush(Color.FromArgb(160, 255, 0, 0))
        Dim greenBrush As New SolidBrush(Color.FromArgb(160, 0, 255, 0))

        ' Set the compositing mode so that when we draw overlapping ellipses,
        ' the colors of the ellipses are not blended.
        bitmapGraphics.CompositingMode = CompositingMode.SourceCopy

        ' Fill an ellipse using a red brush that has an alpha value of 160.
        bitmapGraphics.FillEllipse(redBrush, 0, 0, 150, 70)

        ' Fill a second ellipse using a green brush that has an alpha value of 
        ' 160. The green ellipse overlaps the red ellipse, but the green is not 
        ' blended with the red.
        bitmapGraphics.FillEllipse(greenBrush, 30, 30, 150, 70)

        'Set the compositing quality of the form's Graphics object. 
        e.Graphics.CompositingQuality = CompositingQuality.GammaCorrected

        ' Draw a multicolored background.
        Dim colorBrush As New SolidBrush(Color.Aqua)
        e.Graphics.FillRectangle(colorBrush, 200, 0, 60, 100)
        colorBrush.Color = Color.Yellow
        e.Graphics.FillRectangle(colorBrush, 260, 0, 60, 100)
        colorBrush.Color = Color.Fuchsia
        e.Graphics.FillRectangle(colorBrush, 320, 0, 60, 100)

        'Display the bitmap on a white background.
        e.Graphics.DrawImage(myBitmap, 0, 0)

        ' Display the bitmap on a multicolored background.
        e.Graphics.DrawImage(myBitmap, 200, 0)

// Create a blank bitmap.
Bitmap myBitmap = new Bitmap(180, 100);

// Create a Graphics object that we can use to draw on the bitmap.
Graphics bitmapGraphics = Graphics.FromImage(myBitmap);

// Create a red brush and a green brush, each with an alpha value of 160.
SolidBrush redBrush = new SolidBrush(Color.FromArgb(160, 255, 0, 0));
SolidBrush greenBrush = new SolidBrush(Color.FromArgb(160, 0, 255, 0));

// Set the compositing mode so that when we draw overlapping ellipses,
// the colors of the ellipses are not blended.
bitmapGraphics.CompositingMode = CompositingMode.SourceCopy;

// Fill an ellipse using a red brush that has an alpha value of 160.
bitmapGraphics.FillEllipse(redBrush, 0, 0, 150, 70);

// Fill a second ellipse using a green brush that has an alpha value of 160. 
// The green ellipse overlaps the red ellipse, but the green is not 
// blended with the red.
bitmapGraphics.FillEllipse(greenBrush, 30, 30, 150, 70);

// Set the compositing quality of the form's Graphics object. 
e.Graphics.CompositingQuality = CompositingQuality.GammaCorrected;

// Draw a multicolored background.
SolidBrush colorBrush = new SolidBrush(Color.Aqua);
e.Graphics.FillRectangle(colorBrush, 200, 0, 60, 100);
colorBrush.Color = Color.Yellow;
e.Graphics.FillRectangle(colorBrush, 260, 0, 60, 100);
colorBrush.Color = Color.Fuchsia;
e.Graphics.FillRectangle(colorBrush, 320, 0, 60, 100);

// Display the bitmap on a white background.
e.Graphics.DrawImage(myBitmap, 0, 0);

// Display the bitmap on a multicolored background.
e.Graphics.DrawImage(myBitmap, 200, 0);

Kompilieren des Codes

Das vorhergehende Beispiel ist für die Verwendung mit Windows Forms konzipiert und erfordert PaintEventArgs e, einen Parameter von PaintEventHandler.

Siehe auch

Referenz

FromArgb

Weitere Ressourcen

Alphablending von Linien und Füllungen