Direct2D位图刷拉长

时间:2015-03-02 09:10:44

标签: c++ bitmap rendering 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);
}

1 个答案:

答案 0 :(得分:2)

效果是标准行为的结果。如果使用位图画笔,则可以选择不同的扩展模式(默认为钳位)。这定义了几何尺寸超过位图大小时会发生什么(如FillRect()的情况)。您必须在 D2D1_BITMAP_BRUSH_PROPERTIES 结构中定义X轴和Y轴的扩展模式,并将其传递给 ID2D1RenderTarget :: CreateBitmapBrush()

您可以选择(as stated here):

  • Clamp(重复位图的最后一行)
  • 换行(平铺位图)
  • 镜子

如果你不希望你的位图被钳制,你只需使用 ID2D1RenderTarget :: DrawBitmap()方法。

修改:如果 sourceRectangle destinationRectangle 的大小不同,则会拉伸位图。您可以通过指定 D2D1_BITMAP_INTERPOLATION_MODE 来调整拉伸质量(算法)。我认为它默认为最近邻居,但线性插值质量更好。