【发布时间】:2020-09-17 05:00:18
【问题描述】:
我有一个使用 ID2D1HwndRenderTarget::DrawBitmap() 显示的 Direct2D ID2D1Bitmap。我正在尝试水平翻转图像。
我阅读了this article,它解释了如何翻转从文件中读取的图像,但我有 ID2D1Bitmap。
我看到对使用 IWICBitmapFlipRotator 的引用,但 IWICBitmapFlipRotator::Initialize() 采用 IWICBitmapSource 而不是 ID2D1Bitmap。 (我很确定我在第一次加载图像时在 IWICFormatConverter 中有一个 WIC 位图,但我无法为加载的大约 100 个图像保存 WIC 对象。我只需要偶尔翻转图像。)
我看到了使用变换矩阵的示例,这看起来很有希望,并且是一个很好的选择(我已经应用了 D2D1::Matrix3x2F::Rotation() 变换),但是当我应用这个变换时,显示屏上什么也没有出现。
D2D1_MATRIX_3X2_F flip = D2D1::Matrix3x2F(-1, 0, 0, 1, 0, 0);
m_pTarget->SetTransform(flip);
m_pTarget->DrawBitmap(pBitmap, ...);
我看过一些关于 D2D1_ORIENTATION_FLIP_HORIZONTAL 的参考资料,但没有关于如何使用它的示例。
我显然是 Direct2D 新手。感谢您的帮助!
更新:我发现上面显示的 Matrix3x2F(-1, 0, 0, 1, 0, 0) 代码在渲染时确实会水平翻转(又名“镜像”)图像。但是,它也会将图像向左移动,因此它不可见。为了对此进行调整,我还应用了 Matrix3x2F::Translation(xShift, 0) 来重新定位位图。我通过基于位图的预期位置和位图宽度的复杂(又名蹩脚、虚假、尴尬)公式确定 xShift 值。我确信有一种更简洁的方法来适应所需的 x 轴偏移,但这个解决方案很有效。
【问题讨论】:
-
您可以使用 ID2D1DeviceContext2::CreateTransformedImageSource docs.microsoft.com/en-us/windows/win32/api/d2d1_3/… 并将 D2D1_ORIENTATION_FLIP_HORIZONTAL 作为 D2D1_TRANSFORMED_IMAGE_SOURCE_PROPERTIES 参数的参数传递。
-
谢谢,西蒙·穆里埃。我查看了 CreateTransformedImageSource(),但在 Google 搜索中总共有 19 个引用它。与我在 OP 中提到的其他项目一样,它可能会导致可能的解决方案,但我找不到足够的细节来实施它。
标签: bitmap transformation direct2d