Freigeben über


Verwenden einer Bitmap als Deckkraftmaske

In diesem Thema wird beschrieben, wie Sie eine Bitmap als Deckkraftmaske verwenden, indem Sie die ID2D1Factory::FillOpacityMask-Methode aufrufen. Die Deckkraftmaske ist eine Bitmap, die die Abdeckungsinformationen bereitstellt, die durch den Alphakanal dargestellt werden, der die Transparenz des gerenderten Inhalts steuert. Dieser Ansatz ist effizienter als die Verwendung von Ebenen mit einer Deckkraftmaske. Weitere Informationen finden Sie in der Ebenen-Übersicht.

So schneiden Sie einen Bereich aus

  1. Laden Sie die ursprüngliche Bitmap aus einer Ressource. Informationen zum Laden einer Bitmap finden Sie unter Laden einer Bitmap aus einer Ressource.
  2. Laden Sie die Bitmap-Maske aus einer Ressource.
  3. Erstellen Sie einen Bitmap-Pinsel mit der ursprünglichen Bitmap. Informationen zum Erstellen eines Bitmap-Pinsels finden Sie unter So erstellen Sie einen Bitmap-Pinsel.
  4. Rufen Sie ID2D1Factory::SetAntialiasMode auf, um den Antialias-Modus auf dem Renderziel auf D2D1_ANTIALIAS_MODE_ALIASED zu setzen, damit ID2D1Factory::FillOpacityMask funktioniert.
  5. Rufen Sie FillOpacityMask mit der Bitmap-Maske und dem Bitmap-Pinsel auf dem Render-Ziel auf, um den Clip auszufüllen.

Die folgende Abbildung zeigt die ursprüngliche Bitmap auf der linken Seite, das Bitmap-Format in der Mitte und die Bitmap, die auf die Maske rechts zugeschnitten ist.

Abbildung einer Goldfisch-Bitmap, einer fischförmigen Maske, die aus der Bitmap erstellt wird, und der resultierenden fischförmigen Bitmap nach der Maske

Der folgende Code zeigt, wie Sie den Bereich mit der in der vorherigen Abbildung gezeigten Maske ausschneiden. Zunächst wird die ursprüngliche Bitmap und die Bitmap-Maske geladen. Anschließend wird ein Bitmap-Pinsel mit der ursprünglichen Bitmap erstellt.

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

Anschließend wird SetAntialiasMode aufgerufen, um den Antialias-Modus festzulegen. Rufen Sie FillOpacityMask auf, um eine Bitmap-Maske zum Ausschneiden der ursprünglichen Bitmap zu verwenden.

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

Weitere Informationen zu Deckkraftmasken finden Sie in der Übersicht über Deckkraftmasken.

Direct2D-Referenz