使用合成模式控制 Alpha 混合

有时可能需要创建具有以下特征的屏幕外位图:

  • 颜色的 alpha 值小于 255。
  • 创建位图时,颜色不会相互 alpha 混合。
  • 显示完成的位图时,位图中的颜色会与显示设备上的背景颜色进行 alpha 混合。

若要创建此类位图,请构造一个空白 Bitmap 对象,然后基于该位图构造 Graphics 对象。 将 Graphics 对象的合成模式设置为 CompositingModeSourceCopy。

以下示例基于 Bitmap 对象创建 Graphics 对象。 该代码使用 Graphics 对象以及两个半透明画笔, (alpha = 160) 在位图上绘制。 代码使用半透明画笔填充红色椭圆形和绿色椭圆形。 绿色椭圆与红色椭圆重叠,但绿色不与红色椭圆混合,因为 Graphics 对象的合成模式设置为 CompositingModeSourceCopy。

接下来,代码通过调用 BeginPaint 并基于设备上下文创建 Graphics 对象来准备在屏幕上绘图。 该代码在屏幕上绘制了两次位图:一次在白色背景上,一次在彩色背景上。 位图中属于两个椭圆形的像素的 alpha 分量为 160,因此椭圆形与屏幕上的背景颜色混合。

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

下图显示了上述代码的输出。 请注意,椭圆形与背景混合,但它们彼此不混合。

显示两个不同颜色的椭圆的插图,每个椭圆都与其多色背景混合

前面的代码示例具有以下语句:

bitmapGraphics.SetCompositingMode(CompositingModeSourceCopy);

如果希望椭圆形相互混合以及与背景混合,请将该语句更改为以下内容:

bitmapGraphics.SetCompositingMode(CompositingModeSourceOver);

下图显示了修改后的代码的输出。

使用合成模式控制 alpha 混合插图