Bagikan melalui


Cara Klip ke Masker Geometris

Topik ini menjelaskan cara menggunakan masker geometris untuk mengklip wilayah lapisan.

Untuk mengklip wilayah dengan masker geometris

  1. Buat ID2D1Geometry yang akan digunakan untuk mengklip wilayah.
  2. Panggil ID2D1RenderTarget::CreateLayer untuk membuat lapisan.
  3. Panggil ID2D1RenderTarget::P ushLayer dan berikan masker geometris yang Anda tentukan di langkah 1.
  4. Gambar konten ke klip.
  5. Panggil ID2D1RenderTarget::P opLayer untuk menghapus lapisan dari target render.

Contoh berikut menggunakan masker geometris untuk mengklip gambar dan beberapa persegi panjang. Ilustrasi berikut menunjukkan bitmap asli di sebelah kiri, dan bitmap diklip ke masker geometris di sebelah kanan.

ilustrasi bitmap ikan mas sebelum dan sesudah bitmap dipotong ke masker berbentuk star

Untuk mengklip gambar seperti yang diperlihatkan dalam ilustrasi sebelumnya, Anda membuat ID2D1PathGeometry dan menggunakannya untuk menentukan star. Kode berikut menunjukkan cara melakukannya.

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

Panggil CreateLayer untuk membuat lapisan.

Catatan

Dimulai dengan Windows 8, Anda tidak perlu memanggil CreateLayer. Dalam kebanyakan situasi, performa lebih baik jika Anda tidak memanggil metode ini dan Direct2D mengelola sumber daya lapisan.

 

Panggil PushLayer dengan masker geometri untuk mendorong lapisan. Gambar konten ke klip, lalu panggil PopLayer untuk memunculkan lapisan. Ini menghasilkan gambar berbentuk star. Kode berikut menunjukkan cara melakukannya.

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

Gambaran Umum Lapisan

Referensi Direct2D