gpt4 book ai didi

c++ - Direct2D 位图画笔拉长

转载 作者:搜寻专家 更新时间:2023-10-31 02:23:51 24 4
gpt4 key购买 nike

我必须在离屏位图上绘制形状,但在尝试渲染位图时遇到一个奇怪的问题。

图片应该这样显示:

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

最佳答案

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

您可以选择(as stated here):

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

如果您不希望您的位图被夹紧或包裹,您可以只使用 ID2D1RenderTarget::DrawBitmap() 方法。

编辑:如果 sourceRectangledestinationRectangle 的大小不同,位图将被拉伸(stretch)。您可以通过指定 D2D1_BITMAP_INTERPOLATION_MODE 来调整拉伸(stretch)质量(算法)。我认为它默认为最近邻,但线性插值质量更好。

关于c++ - Direct2D 位图画笔拉长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28806029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com