Como: Usar o modo de composição para alfa de controle de mesclagem

Pode haver ocasiões quando desejar criar um bitmap fora da tela que tem as seguintes características:

  • As cores têm valores alfa menor que 255.

  • Cores não são alfa misturados entre si enquanto você cria um bitmap.

  • Quando você exibe o bitmap concluído, as cores no bitmap são alpha, combinada com as cores de fundo para o dispositivo de vídeo.

Para criar esse bitmap, construir um espaço em branco Bitmap de objeto e, então, construir um Graphics objeto baseado em bitmap. Definir o modo de composição do Graphics o objeto para CompositingMode.SourceCopy.

Exemplo

O exemplo a seguir cria um Graphics objeto baseado em um Bitmap objeto. O código usa a Graphics objeto junto com dois pincéis semitransparentes (alfa = 160) para pintar em bitmap. O código preenche uma elipse vermelha e uma elipse verde usando os pincéis semitransparentes. Elipse verde se sobrepõe a elipse vermelha, mas não o verde é combinado com o vermelho porque o modo de composição da Graphics objeto é definido como SourceCopy.

O código desenha o bitmap na tela duas vezes: vez em um fundo branco e uma vez em um plano de fundo multicolorido. Os pixels no bitmap que fazem parte de duas elipses têm um componente alfa de 160, portanto, as elipses são mescladas com as cores de fundo na tela.

A ilustração a seguir mostra a saída do exemplo de código. Observe que as elipses são mescladas com o plano de fundo, mas eles não são mesclados entre si.

SourceCopy

O exemplo de código contém esta instrução:

        bitmapGraphics.CompositingMode = CompositingMode.SourceCopy

bitmapGraphics.CompositingMode = CompositingMode.SourceCopy;

Se desejar que as elipses para ser misturados entre si, bem como com o plano de fundo, altere essa instrução para o seguinte:

        bitmapGraphics.CompositingMode = CompositingMode.SourceOver

bitmapGraphics.CompositingMode = CompositingMode.SourceOver;

A ilustração a seguir mostra a saída do código revisado.

SourceOver

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

Compilando o código

O exemplo anterior é projetado para uso com o Windows Forms e requer PaintEventArgs e, que é um parâmetro de PaintEventHandler.

Consulte também

Referência

FromArgb

Outros recursos

Preenchimentos e linhas de mistura alfa