如何剪裁到几何掩码

本主题介绍如何使用几何掩码剪裁图层的区域。

使用几何蒙板剪裁区域

  1. 创建将用于剪辑区域的 ID2D1Geometry
  2. 调用 ID2D1RenderTarget::CreateLayer 来创建层。
  3. 调用 ID2D1RenderTarget::P ushLayer 并传递在步骤 1 中定义的几何掩码。
  4. 绘制要剪辑的内容。
  5. 调用 ID2D1RenderTarget::P opLayer 以从呈现器目标中删除该层。

下面的示例使用几何蒙板剪裁图像和多个矩形。 下图显示了左侧的原始位图,以及剪裁到右侧的几何掩码的位图。

金鱼位图在剪裁成star形蒙板之前和之后的图示

若要如上图所示剪裁绘图,请创建 ID2D1PathGeometry 并使用它定义star。 下面的代码演示如何执行此操作。

// Create the path geometry.
if (SUCCEEDED(hr))
{
    hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometry);
}

// Write to the path geometry using the geometry sink to create a star.
if (SUCCEEDED(hr))
{
    hr = m_pPathGeometry->Open(&pSink);
}
if (SUCCEEDED(hr))
{
    pSink->SetFillMode(D2D1_FILL_MODE_WINDING);
    pSink->BeginFigure(D2D1::Point2F(20, 50), D2D1_FIGURE_BEGIN_FILLED);
    pSink->AddLine(D2D1::Point2F(130, 50));
    pSink->AddLine(D2D1::Point2F(20, 130));
    pSink->AddLine(D2D1::Point2F(80, 0));
    pSink->AddLine(D2D1::Point2F(130, 130));
    pSink->EndFigure(D2D1_FIGURE_END_CLOSED);

    hr = pSink->Close();
}

SafeRelease(&pSink);

调用 CreateLayer 以创建层。

注意

从 Windows 8 开始,无需调用 CreateLayer。 在大多数情况下,如果不调用此方法并且 Direct2D 管理层资源,性能会更好。

 

使用几何图形掩码调用 PushLayer 以推送层。 绘制要剪辑的内容,然后调用 PopLayer 以弹出图层。 这将生成star形状的绘图。 下面的代码演示如何执行此操作。

HRESULT DemoApp::RenderWithLayer(ID2D1RenderTarget *pRT)
{
    HRESULT hr = S_OK;

    // Create a layer.
    ID2D1Layer *pLayer = NULL;
    hr = pRT->CreateLayer(NULL, &pLayer);

    if (SUCCEEDED(hr))
    {
        pRT->SetTransform(D2D1::Matrix3x2F::Translation(350, 50));

        // Push the layer with the geometric mask.
        pRT->PushLayer(
            D2D1::LayerParameters(D2D1::InfiniteRect(), m_pPathGeometry),
            pLayer
            );
            
  
        pRT->DrawBitmap(m_pOrigBitmap, D2D1::RectF(0, 0, 200, 133));
        pRT->FillRectangle(D2D1::RectF(0.f, 0.f, 25.f, 25.f), m_pSolidColorBrush);  
        pRT->FillRectangle(D2D1::RectF(25.f, 25.f, 50.f, 50.f), m_pSolidColorBrush);
        pRT->FillRectangle(D2D1::RectF(50.f, 50.f, 75.f, 75.f), m_pSolidColorBrush); 
        pRT->FillRectangle(D2D1::RectF(75.f, 75.f, 100.f, 100.f), m_pSolidColorBrush);    
        pRT->FillRectangle(D2D1::RectF(100.f, 100.f, 125.f, 125.f), m_pSolidColorBrush); 
        pRT->FillRectangle(D2D1::RectF(125.f, 125.f, 150.f, 150.f), m_pSolidColorBrush);    
        

        pRT->PopLayer();
    }

    SafeRelease(&pLayer);

    return hr;
}

层概述

Direct2D 参考