Compartilhar via


Como usar um bitmap como uma máscara de opacidade

Este tópico descreve como usar um bitmap como uma máscara de opacidade chamando o método ID2D1Factory::FillOpacityMask. A máscara de opacidade é um bitmap que fornece as informações de cobertura representadas pelo canal alfa, que controla a transparência do conteúdo renderizado. Essa abordagem é mais eficiente do que usar camadas com uma máscara de opacidade. Para obter mais informações, consulte Visão geral de camadas.

Para recortar uma região

  1. Carregue o bitmap original de um recurso. Para obter informações sobre como carregar um bitmap, consulte Como carregar um bitmap de um recurso.
  2. Carregue a máscara de bitmap de um recurso.
  3. Crie um pincel de bitmap com o bitmap original. Para obter informações sobre como criar um pincel de bitmap, consulte Como criar um pincel de bitmap.
  4. Chame ID2D1Factory::SetAntialiasMode para definir o modo de suavização no destino de renderização para D2D1_ANTIALIAS_MODE_ALIASED para ID2D1Factory::FillOpacityMask funcionar.
  5. Chame FillOpacityMask com a máscara de bitmap e o pincel de bitmap no destino de renderização para preencher o clipe.

A ilustração a seguir mostra o bitmap original à esquerda, a máscara de bitmap no centro e o bitmap cortado para a máscara à direita.

ilustração de um bitmap de peixinho dourado, uma máscara em forma de peixe que é criada a partir do bitmap e o bitmap em forma de peixe resultante após a máscara

O código a seguir mostra como cortar a região com a máscara mostrada na ilustração anterior. Ele primeiro carrega o bitmap original e a máscara de bitmap. E, em seguida, cria um pincel de bitmap com o bitmap original.

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

Em seguida, ele chama SetAntialiasMode para definir o modo de suavização. Chame FillOpacityMask para usar uma máscara de bitmap para cortar o bitmap original.

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

Para obter mais informações sobre máscaras de opacidade, consulte a Visão geral de máscaras de opacidade.

Referência do Direct2D