次の方法で共有


ビットマップを不透明度マスクとして使用する方法

このトピックでは、ID2D1Factory::FillOpacityMask メソッドを呼び出して、ビットマップを不透明度マスクとして使用する方法について説明します。 不透明度マスクは、アルファ チャネルによって表されるカバレッジ情報を提供するビットマップであり、レンダリングされるコンテンツの透明度を制御します。 この方法は、不透明度マスクでレイヤーを使用するよりも効率的です。 詳細については、「レイヤーの概要」を参照してください。

領域をクリップするには

  1. リソースから元のビットマップを読み込みます。 ビットマップを読み込む方法については、「リソースからビットマップを読み込む方法」を参照してください。
  2. リソースからビットマップ マスクを読み込みます。
  3. 元のビットマップを使用してビットマップ ブラシを作成します。 ビットマップ ブラシを作成する方法については、「ビットマップ ブラシを作成する方法」を参照してください。
  4. ID2D1Factory::SetAntialiasMode を呼び出して、レンダリング ターゲットのアンチエイリアス モードを ID2D1Factory::FillOpacityMask が機能するように D2D1_ANTIALIAS_MODE_ALIASED に設定します。
  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 リファレンス