共用方式為


如何使用位圖作為不透明度遮罩

本主題描述如何藉由呼叫 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 參考