我有以下代码在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);
但现在根本没有绘制位图。当我提供身份矩阵时,它可以工作。当我尝试将矩阵中的y
值从1
替换为-1
时,它再次失败(我相信它与在原始代码段中制作旋转矩阵相同)
还尝试为D2D_RECT_F
提供destinationRectangle
结构,并尝试在rect中的 top 和 bottom 值之间切换 - 同样问题依然存在。
非常欢迎任何内幕。
答案 0 :(得分:1)
我不确定" perspectiveTransform" DrawBitmap的参数意味着,但在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。