调用时无法翻转位图 ID2D1DeviceContext::DrawBitmap

Can't flip bitmap when calling ID2D1DeviceContext::DrawBitmap

我有以下代码在 Direct2D 上下文中绘制位图:

ID2D1DeviceContext * pContext;  // initialization omitted
ID2D1Bitmap1 * pBitmap;         // initialization omitted
pContext->DrawBitmap(pBitmap, NULL, 1.f, D2D1_INTERPOLATION_MODE_LINEAR, NULL, NULL);

这很好用,但我需要我的图像垂直翻转,所以我尝试了这个:

D2D_MATRIX_4X4_F flip = D2D1::Matrix4x4F::RotationY(180);
pContext->DrawBitmap(pBitmap, NULL, 1.f, D2D1_INTERPOLATION_MODE_LINEAR, NULL, &flip);

但是现在根本没有绘制位图。当我改为提供 identity 矩阵时,它起作用了。当我尝试将矩阵中的 y 值从 1 替换为 -1 时,它再次失败(我相信这与在原始代码片段中创建旋转矩阵相同)。

还尝试为destinationRectangle提供D2D_RECT_F结构,并尝试在topbottom[=33之间切换=] 矩形中的值 - 同样的问题仍然存在。

非常欢迎任何内幕。

我不确定 DrawBitmap 的 "perspectiveTransform" 参数是什么意思,但在 Direct2D 中使用转换的传统方式确实有效:

const D2D1_SIZE_F& size = pContext->GetSize();
D2D1_POINT_2F center = D2D1::Point2F(size.width / 2.0f, size.height / 2.0f);

pContext->SetTransform(D2D1::Matrix3x2F::Rotation(180.0f, center);
pContext->DrawBitmap(pBitmap);
pContext->SetTransform(D2D1::Matrix3x2F::Identity());

请注意,这使用了 ID2D1RenderTarget::DrawBitmap 方法,而不是 ID2D1DeviceContext::DrawBitmap(尽管两者都应该有效,只是不要使用 perspectiveTransform 参数)。我测试了这个并且它有效。

另一种可能更有效的方法是首先创建一个 WIC 位图 (IWICBitmapSource),使用 IWICBitmapFlipRotator 旋转它,然后使用 ID2D1RenderTarget::CreateBitmapFromWicBitmap 从旋转器创建一个 ID2D1Bitmap。有关这方面的演示,请参阅 How to Flip and Rotate a Bitmap Source.