调用ID2D1DeviceContext :: DrawBitmap时,不能翻转位图

时间:2015-07-22 14:34:20

标签: bitmap directx directx-11 direct2d

我有以下代码在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 值之间切换 - 同样问题依然存在。

非常欢迎任何内幕。

1 个答案:

答案 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