2015-03-02 4 views
2

Мне нужно нарисовать свои фигуры на растровом изображении вне экрана, но у меня есть странная проблема, когда я пытаюсь отобразить растровое изображение.Растровая кисть Direct2D удлиненная

Это, как должно отображаться изображение:

enter image description here

И это, как я видеть растровое изображение:

enter image description here

Ниже приведен код, который я использовать для создания растрового изображения щетка:

const auto size = renderTarget->GetSize(); 
const auto pxSize = D2D1::SizeU(size.width * 4, size.height * 4); 

ID2D1BitmapRenderTarget* compatibleRenderTarget; 
HRESULT hr = renderTarget->CreateCompatibleRenderTarget(size, pxSize, &compatibleRenderTarget); 

if (SUCCEEDED(hr)) 
{ 
    // compute visible area and the current transformation matrix 
    const auto area = get_visible_area(renderTarget); 
    const auto transform = D2D1::Matrix3x2F::Identity(); 

    // offscreen bitmap rendering 
    compatibleRenderTarget->BeginDraw(); 

    // draw all shapes 

    compatibleRenderTarget->EndDraw(); 

    // Retrieve the bitmap from the render target. 
    ID2D1Bitmap* bitmap; 
    hr = compatibleRenderTarget->GetBitmap(&bitmap); 

    // release the compatible render target 
    compatibleRenderTarget->Release(); 

    // Create the bitmap brush 
    ID2D1BitmapBrush* bitmapBrush = nullptr; 
    hr = renderTarget->CreateBitmapBrush(bitmap, D2D1::BitmapBrushProperties(), &bitmapBrush); 
    bitmap->Release(); 


    // draw bitmap 
    renderTarget->FillRectangle(area, bitmapBrush); 
} 
+0

Ваш вопрос о расширенной нижней строке или о потере качества растрового изображения? –

+0

@ АнтонАнджелов Речь идет о расширенной нижней строке. На самом деле я исправил его, просто удвоил размер моей совместимой цели рендеринга, но я не могу сказать, почему ... – Nick

+0

Почему вы не используете ID2D1RenderTarget :: DrawBitmap() и передаете offscreen растровое изображение вместо создания растровой кисти? Это намного проще. Также возникает второй вопрос: перерисовываете ли вы растровое изображение вне экрана каждый раз, когда вы оказываете рендеринг HWND? –

ответ

2

Эффект является результатом стандартного поведения. Если вы используете растровую кисть, вы можете выбрать различные режимы продления (по умолчанию - зажим). Это определяет, что произойдет, если размер геометрии превышает размер растрового изображения (как в вашем случае с FillRect()). Вы должны определить режимы протяженности для осей X и Y в структуре D2D1_BITMAP_BRUSH_PROPERTIES, которую вы проходите до ID2D1RenderTarget :: CreateBitmapBrush().

Вы можете выбрать между (as stated here):

  • зажима (повторить последнюю строку растрового изображения)
  • Wrap (плитка растровый)
  • Зеркало

Если вы не хотите, чтобы ваш растровый рисунок не был зажат без обертывания, вы можете просто использовать метод ID2D1RenderTarget :: DrawBitmap().

Edit: Если sourceRectangle отличается от destinationRectangle в размере, растровый будет растягиваться. Вы можете отрегулировать качество растяжения (алгоритм), указав D2D1_BITMAP_INTERPOLATION_MODE. Я думаю, что он по умолчанию подходит к ближайшему соседу, но линейная интерполяция - лучшее качество.

Смежные вопросы