Utilisation du mode de composition pour contrôler la fusion alpha
Il peut arriver que vous souhaitiez créer une bitmap hors écran qui présente les caractéristiques suivantes :
- Les couleurs ont des valeurs alpha inférieures à 255.
- Les couleurs ne sont pas fusionnées alpha les unes avec les autres lorsque vous créez la bitmap.
- Lorsque vous affichez la bitmap terminée, les couleurs de la bitmap sont fusionnées avec les couleurs d’arrière-plan de l’appareil d’affichage.
Pour créer un tel bitmap, construisez un objet Bitmap vide, puis construisez un objet Graphics basé sur cette bitmap. Définissez le mode de composition de l’objet Graphics sur CompositingModeSourceCopy.
L’exemple suivant crée un objet Graphics basé sur un objet Bitmap . Le code utilise l’objet Graphics avec deux pinceaux semi-transparents (alpha = 160) pour peindre sur la bitmap. Le code remplit une ellipse rouge et une ellipse verte à l’aide des pinceaux semi-transparents. L’ellipse verte chevauche l’ellipse rouge, mais le vert n’est pas fusionné avec le rouge, car le mode de composition de l’objet Graphics est défini sur CompositingModeSourceCopy.
Ensuite, le code se prépare à dessiner à l’écran en appelant BeginPaint et en créant un objet Graphics basé sur un contexte d’appareil. Le code dessine la bitmap à l’écran deux fois : une fois sur un arrière-plan blanc et une fois sur un arrière-plan multicolore. Les pixels de la bitmap qui font partie des deux ellipses ont un composant alpha de 160, de sorte que les ellipses sont fusionnées avec les couleurs d’arrière-plan à l’écran.
// Create a blank bitmap.
Bitmap bitmap(180, 100);
// Create a Graphics object that can be used to draw on the bitmap.
Graphics bitmapGraphics(&bitmap);
// Create a red brush and a green brush, each with an alpha value of 160.
SolidBrush redBrush(Color(210, 255, 0, 0));
SolidBrush greenBrush(Color(210, 0, 255, 0));
// Set the compositing mode so that when overlapping ellipses are drawn,
// the colors of the ellipses are not blended.
bitmapGraphics.SetCompositingMode(CompositingModeSourceCopy);
// 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 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);
// Prepare to draw on the screen.
hdc = BeginPaint(hWnd, &ps);
Graphics* pGraphics = new Graphics(hdc);
pGraphics->SetCompositingQuality(CompositingQualityGammaCorrected);
// Draw a multicolored background.
SolidBrush brush(Color((ARGB)Color::Aqua));
pGraphics->FillRectangle(&brush, 200, 0, 60, 100);
brush.SetColor(Color((ARGB)Color::Yellow));
pGraphics->FillRectangle(&brush, 260, 0, 60, 100);
brush.SetColor(Color((ARGB)Color::Fuchsia));
pGraphics->FillRectangle(&brush, 320, 0, 60, 100);
// Display the bitmap on a white background.
pGraphics->DrawImage(&bitmap, 0, 0);
// Display the bitmap on a multicolored background.
pGraphics->DrawImage(&bitmap, 200, 0);
delete pGraphics;
EndPaint(hWnd, &ps);
L’illustration suivante montre la sortie du code précédent. Notez que les ellipses sont fusionnées avec l’arrière-plan, mais qu’elles ne sont pas fusionnées les unes avec les autres.
L’exemple de code précédent contient l’instruction suivante :
bitmapGraphics.SetCompositingMode(CompositingModeSourceCopy);
Si vous souhaitez que les points de suspension soient fusionnés entre eux ainsi qu’avec l’arrière-plan, remplacez cette instruction par ce qui suit :
bitmapGraphics.SetCompositingMode(CompositingModeSourceOver);
L’illustration suivante montre la sortie du code révisé.