Bagikan melalui


Cara Membuat Klip ke Masker Geometris

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

Untuk mengklip wilayah dengan masker geometris

  1. Buat ID2D1Geometry yang akan digunakan untuk memotong area.
  2. Panggil ID2D1RenderTarget::CreateLayer untuk membuat lapisan.
  3. Panggil ID2D1RenderTarget::PushLayer dan berikan masker geometrik yang Anda tentukan di langkah 1.
  4. Gambar konten yang akan diklip.
  5. Panggil ID2D1RenderTarget::PopLayer 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 menjadi topeng berbentuk bintang

Untuk memotong gambar seperti yang diperlihatkan dalam ilustrasi sebelumnya, Anda membuat ID2D1PathGeometry dan menggunakannya untuk menentukan bintang. Kode berikut menunjukkan cara melakukan ini.

// 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.

Nota

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 memasukkan lapisan. Gambar konten ke klip, lalu panggil PopLayer untuk memunculkan lapisan. Ini menghasilkan gambar berbentuk bintang. Kode berikut menunjukkan cara melakukan ini.

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