调用时无法翻转位图 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
结构,并尝试在top和bottom[=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.
我有以下代码在 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
结构,并尝试在top和bottom[=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.