重新渲染时水平翻转 ID2D1Bitmap

Flip ID2D1Bitmap horizontally when redendering

我有一个使用 ID2D1HwndRenderTarget::DrawBitmap() 显示的 Direct2D ID2D1Bitmap。我正在尝试水平翻转图像。

我阅读了 this article,它解释了如何翻转从文件中读取的图像,但我有 ID2D1Bitmap。

我看到关于使用 IWICBitmapFlipRotator, but 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) 代码确实在渲染时水平翻转(又名 "mirror")图像。但是,它还会将图像向左移动,因此它不可见。为此,我还应用 Matrix3x2F::Translation(xShift, 0) 来重新定位位图。我通过一个基于位图的预期位置和位图宽度的复杂(又名蹩脚、虚假、令人尴尬的)公式来确定 xShift 值。我确信有一种更简洁的方法来适应所需的 x 轴偏移,但此解决方案有效。

我发现上面显示的 Matrix3x2F(-1, 0, 0, 1, 0, 0) 代码确实在渲染时水平翻转(又名 "mirror")图像。但是,它还会将图像向左移动,因此它不可见。为此,我还应用 Matrix3x2F::Translation(xShift, 0) 来重新定位位图。我通过一个基于位图的预期位置和位图宽度的复杂(又名蹩脚、虚假、令人尴尬的)公式来确定 xShift 值。我确信有一种更简洁的方法来适应所需的 x 轴偏移,但此解决方案有效。