共用方式為


如何裁剪到幾何圖形遮罩

本主題描述如何使用幾何遮罩來裁剪圖層的區域。

裁剪具有幾何掩模的區域

  1. 建立將用來裁剪區域的 ID2D1Geometry
  2. 呼叫 ID2D1RenderTarget::CreateLayer 來建立圖層。
  3. 呼叫 ID2D1RenderTarget::PushLayer,並傳遞您在步驟 1 中定義的幾何遮罩。
  4. 繪製要裁剪的內容。
  5. 呼叫 ID2D1RenderTarget::PopLayer,以從渲染目標中移除層。

下列範例會使用幾何遮罩來裁剪影像和數個矩形。 下圖顯示左側的原始點陣圖,以及右側經幾何遮罩裁剪過的點陣圖。

金魚在裁剪到星形遮罩之前和之後的位圖插圖

若要如上圖所示裁剪繪圖,您可以建立 ID2D1PathGeometry,並使用它來定義星形。 下列程式代碼示範如何執行這項作。

// 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 彈出圖層。 這會產生星形繪圖。 下列程式代碼示範如何執行這項作。

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 參考