Поделиться через


Как обрезать геометрическую маску

В этом разделе описывается использование геометрической маски для обрезки области слоя.

Обрезка области с помощью геометрической маски

  1. Создайте ID2D1Geometry , который будет использоваться для обрезки региона.
  2. Вызовите ID2D1RenderTarget::CreateLayer , чтобы создать слой.
  3. Вызовите ID2D1RenderTarget::P ushLayer и передайте геометрическую маску, определенную на шаге 1.
  4. Нарисуйте содержимое для обрезки.
  5. Вызовите ID2D1RenderTarget::P opLayer , чтобы удалить слой из целевого объекта отрисовки.

В следующем примере используется геометрическая маска для обрезки изображения и нескольких прямоугольников. На следующем рисунке показано исходное растровое изображение слева и растровое изображение, обрезанное геометрической маской справа.

Иллюстрация растрового изображения goldfish до и после обрезания растрового рисунка к маске 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