在Direct2D中绘制部分图像

时间:2013-08-03 21:20:51

标签: c++ windows direct2d drawbitmap

由于GDI +非常(荒谬)慢,我决定迁移到Direct2D。我在许多论坛(包括this one)上查找了许多主题,但没有成功(也可能是因为事情已经很晚了)而且Direct2D文档仍然相当渺茫(对我来说很困惑)至少)。

无论如何,我有一个.PNG,我在Direct2D中打开,并希望每20ms只绘制一次。

初始化D2D内容

ID2D1Factory* d2dFactory = NULL;
IWICImagingFactory* d2dWICFactory = NULL;
IWICBitmapDecoder* d2dDecoder = NULL;
IWICFormatConverter* d2dConverter = NULL;
ID2D1HwndRenderTarget* d2drender = NULL;
IWICBitmapFrameDecode* d2dBmpSrc = NULL;
ID2D1Bitmap* d2dBmp = NULL;

/* initialize all the good stuff */
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,
               __uuidof(ID2D1Factory), NULL, (void**)&d2dFactory);    

D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top);

hr = d2dFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),
               D2D1::HwndRenderTargetProperties(zgE->getWnd(), size), &d2drender);

hr = CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, 
                   __uuidof(IWICImagingFactory), (void**)(&d2dWICFactory));

hr = d2dWICFactory->CreateDecoderFromFilename(L"tile_1.png", NULL, GENERIC_READ,
                                      WICDecodeMetadataCacheOnLoad, &d2dDecoder);

hr = d2dWICFactory->CreateFormatConverter(&d2dConverter);

hr = d2dDecoder->GetFrame(0, &d2dBmpSrc);

hr = d2dConverter->Initialize(d2dBmpSrc, GUID_WICPixelFormat32bppPBGRA,
              WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeMedianCut);

hr = d2drender->CreateBitmapFromWicBitmap(d2dConverter, NULL, &d2dBmp);

图:

/* draw the image */
D2D1_RECT_F rect = D2D1::RectF(x, y, x + size.width, y + size.height);
d2drender->DrawBitmap(d2dBmp, &rect);

但是,我不能仅仅绘制它的一部分,比如说20 x 20像素。我已经摆弄了DrawBitmap()并使用了不同大小的rect s,但结果却没有裁剪图像。

除了分层之外,有什么方法可以做到,因为我不想在每一帧上分层图像

2 个答案:

答案 0 :(得分:2)

主要是三个步骤

  1. 从文件
  2. 创建整个位图
  3. 通过调用CopyFromBitmap
  4. 获取整个位图的一部分
  5. 绘制在步骤2中创建的位图。

答案 1 :(得分:2)

ID2D1RenderTarget::DrawBitmaphttp://msdn.microsoft.com/en-us/library/windows/desktop/dd371880(v=vs.85).aspx)最多需要5个参数,最后一个是源矩形。您只提供前2个参数,源矩形的默认值是使用整个位图。因此,如果您只想从该部分绘制,则解决方案只是为此参数提供D2D1::RectF(0, 0, 20, 20)