Поделиться через


Использование растрового изображения в качестве маски непрозрачности

В этом разделе описывается использование растрового изображения в качестве маски непрозрачности путем вызова метода ID2D1Factory::FillOpacityMask. Маска непрозрачности — это растровое изображение, которое предоставляет сведения о охвате, представленные альфа-каналом, который управляет прозрачностью отрисованного содержимого. Этот подход более эффективен, чем использование слоев с маской непрозрачности. Дополнительные сведения см. в обзоре слоев.

Обрезать область

  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