【问题标题】:Drawing part of image in Direct2D在 Direct2D 中绘制图像的一部分
【发布时间】:2013-08-27 04:33:17
【问题描述】:

由于 GDI+ 相当(可笑)缓慢,我决定迁移到 Direct2D。我在许多论坛上查找了许多主题(包括this one),但没有成功(这也可能是由于太晚了),而且 Direct2D 文档仍然很薄(至少对我来说令人困惑) )。

无论如何,我有一个在 Direct2D 中打开的 .PNG,并且希望每 20 毫秒只绘制一次它的一部分。

初始化 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() 和不同大小的rects,但结果没有裁剪图像。

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

【问题讨论】:

  • 你实际得到了什么结果?
  • 只能根据参数中矩形的大小以 1:1 整体显示或缩放或拉伸。此外,尝试了另一个 DrawBitmap() 重载(带有 2 个矩形 - 我没有代码)但没有。
  • 分割整个位图的代码在哪里?如果不分割,你是怎么画一部分的?
  • 好了,不知道怎么拆分了。

标签: c++ windows direct2d drawbitmap


【解决方案1】:

ID2D1RenderTarget::DrawBitmap (http://msdn.microsoft.com/en-us/library/windows/desktop/dd371880(v=vs.85).aspx) 最多有 5 个参数,最后一个是源矩形。您只提供前 2 个参数,源矩形的默认设置是使用整个位图。因此,如果您只想从其中的那一部分进行绘制,解决方案就是简单地为该参数提供 D2D1::RectF(0, 0, 20, 20)

【讨论】:

    【解决方案2】:

    主要是三个步骤

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

    【讨论】:

    • 需要提及的是,您必须创建另一个位图,在其中复制大位图中的部分。无论如何,谢谢,它成功了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多