本主题介绍如何通过调用 ID2D1Factory::FillOpacityMask 方法将位图用作不透明蒙板。 不透明蒙板是一个位图,它提供由 alpha 通道表示的覆盖信息,后者控制呈现的内容的透明度。 这种方法比使用带不透明蒙板的图层更有效。 有关详细信息,请参阅图层概述。
剪辑区域
- 从资源加载原始位图。 有关如何加载位图的信息,请参阅如何从资源中加载位图。
- 从资源加载位图蒙版。
- 使用原始位图创建位图画笔。 有关如何创建位图画笔的信息,请参阅如何创建位图画笔。
- 调用 ID2D1Factory::SetAntialiasMode 将呈现器目标上的抗锯齿模式设置为 D2D1_ANTIALIAS_MODE_ALIASED 以使 ID2D1Factory::FillOpacityMask 正常工作。
- 使用呈现器目标上的位图蒙版和位图画笔调用 FillOpacityMask 以填充剪辑。
下图显示左侧为原始位图、中间为位图蒙版,右侧为剪辑成蒙版的位图。
以下代码演示如何使用上图中显示的蒙版剪辑该区域。 其首先加载原始位图和位图蒙版。 然后使用原始位图创建位图画笔。
// Create the bitmap to be used by the bitmap brush
if (SUCCEEDED(hr))
{
hr = LoadResourceBitmap(
m_pRenderTarget,
m_pWICFactory,
L"GoldFish",
L"Image",
&m_pOrigBitmap
);
}
if (SUCCEEDED(hr))
{
hr = LoadResourceBitmap(
m_pRenderTarget,
m_pWICFactory,
L"GoldFishMask",
L"Image",
&m_pBitmapMask
);
}
if (SUCCEEDED(hr))
{
D2D1_BITMAP_BRUSH_PROPERTIES propertiesXClampYClamp = D2D1::BitmapBrushProperties(
D2D1_EXTEND_MODE_CLAMP,
D2D1_EXTEND_MODE_CLAMP,
D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR
);
hr = m_pRenderTarget->CreateBitmapBrush(
m_pOrigBitmap,
propertiesXClampYClamp,
&m_pOriginalBitmapBrush
);
if (SUCCEEDED(hr))
{
hr = m_pRenderTarget->CreateBitmapBrush(
m_pBitmapMask,
propertiesXClampYClamp,
&m_pBitmapMaskBrush
);
}
}
然后,它调用 SetAntialiasMode 来设置反锯齿模式。 调用 FillOpacityMask 以使用位图蒙版剪辑原始位图。
// D2D1_ANTIALIAS_MODE_ALIASED must be set for FillOpacityMask
// to function properly.
m_pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);
m_pRenderTarget->FillOpacityMask(
m_pBitmapMask,
m_pOriginalBitmapBrush,
D2D1_OPACITY_MASK_CONTENT_GRAPHICS,
&rcBrushRect,
NULL
);
m_pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
有关不透明蒙板的更多信息,请参阅不透明蒙板概述。
相关主题