Compartir a través de


Cómo: Utilizar el modo de composición para controlar la mezcla alfa

Puede haber ocasiones en las que se desee crear un mapa de bits fuera de la pantalla con las siguientes características:

  • Los colores tienen valores alfa menores que 255.

  • Los colores no mezclan sus valores alfa cuando se crea el mapa de bits.

  • Cuando se muestra el mapa de bits terminado, los colores del mapa de bits mezclan sus valores alfa con los colores de fondo del dispositivo de presentación.

Para crear dicho mapa de bits, construya un objeto Bitmap en blanco y, a continuación, construya un objeto Graphics basado en ese mapa de bits. Establezca el modo de composición del objeto Graphics en CompositingMode.SourceCopy.

Ejemplo

En el ejemplo siguiente se crea un objeto Graphics basado en un objeto Bitmap. El código utiliza el objeto Graphics junto con dos pinceles semitransparentes (alfa = 160) para pintar en el mapa de bits. El código rellena una elipse roja y otra verde utilizando los pinceles semitransparentes. La elipse verde se superpone a la roja, pero el verde y el rojo no se mezclan porque el modo de composición del objeto Graphics está establecido en SourceCopy.

El código dibuja dos veces el mapa de bits en la pantalla: una sobre un fondo blanco y otra sobre un fondo multicolor. Los píxeles del mapa de bits que forman parte de las dos elipses tienen un componente alfa de 160, por lo que las elipses se mezclan con los colores de fondo de la pantalla.

En la siguiente ilustración se muestra el resultado del código de ejemplo. Tenga en cuenta que las elipses se mezclan con el color de fondo, pero no se mezclan las elipses una con otra.

Copia del código fuente

El ejemplo de código contiene esta instrucción:

        bitmapGraphics.CompositingMode = CompositingMode.SourceCopy

bitmapGraphics.CompositingMode = CompositingMode.SourceCopy;

Si desea que las elipses se mezclen una con otra además de mezclarse con el fondo, cambie esa instrucción a:

        bitmapGraphics.CompositingMode = CompositingMode.SourceOver

bitmapGraphics.CompositingMode = CompositingMode.SourceOver;

En la siguiente ilustración se muestra el resultado del código revisado.

Información de código de origen

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

Compilar el código

El ejemplo anterior está diseñado para formularios Windows Forms y requiere PaintEventArgs e, que es un parámetro de PaintEventHandler.

Vea también

Referencia

FromArgb

Otros recursos

Líneas y rellenos con mezcla alfa