如何将位图用作不透明蒙板

本主题介绍如何通过调用 ID2D1Factory::FillOpacityMask 方法将位图用作不透明蒙板。 不透明蒙板是一个位图,它提供由 alpha 通道表示的覆盖信息,后者控制呈现的内容的透明度。 这种方法比使用带不透明蒙板的图层更有效。 有关详细信息,请参阅图层概述

剪辑区域

  1. 从资源加载原始位图。 有关如何加载位图的信息,请参阅如何从资源中加载位图
  2. 从资源加载位图蒙版。
  3. 使用原始位图创建位图画笔。 有关如何创建位图画笔的信息,请参阅如何创建位图画笔
  4. 调用 ID2D1Factory::SetAntialiasMode 将呈现器目标上的抗锯齿模式设置为 D2D1_ANTIALIAS_MODE_ALIASED 以使 ID2D1Factory::FillOpacityMask 正常工作。
  5. 使用呈现器目标上的位图蒙版和位图画笔调用 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);

有关不透明蒙板的更多信息,请参阅不透明蒙板概述

Direct2D 参考