【问题标题】:How to convert a image file loaded in memory to a ID2D1Bitmap in C++如何将加载到内存中的图像文件转换为 C++ 中的 ID2D1Bitmap
【发布时间】:2014-12-21 09:48:58
【问题描述】:

我正在尝试将我刚刚从压缩文件提取到内存中的图像文件(png,但可以是任何东西)转换为 ID2D1Bitmap 以使用 Direct 2D 进行绘制。我试图寻找一些文档,但我只能找到接收“const char * path”或询问我图像的宽度和高度的方法,这是我事先无法知道的。 在谷歌上搜索它让我一无所获。

该文件在内存中是原始文件,我想避免将图像提取到硬盘驱动器到一个临时文件中,只是为了从那里读取它们的数据。

有什么想法吗?

【问题讨论】:

  • 使用 WIC 从 IWICStream 加载它,然后使用 CreateBitmapFromWicBitmap 获取您的 ID2D1Bitmap - MSDN 上有示例,所以我很惊讶您没有找到任何东西。跨度>
  • 您必须首先将图像(例如使用 WIC)解码为原始 RGB32 像素数据(这可以在内存中完成),然后您可以使用 CreateBitmap() (msdn.microsoft.com/en-us/library/windows/desktop/…)。您应该将指向解码图像的指针传递给 srcData 参数。

标签: c++ windows direct2d imaging


【解决方案1】:

如果你有 HBITMAP 句柄,你可以这样做:

  1. 图片大小使用:::GetObject(hBmp, sizeof(BITMAP), &bmpSizeInfo);
  2. 像这样填写 BITMAPINFO: memset(&bmpData, 0, sizeof(BITMAPINFO)); bmpData.bmiHeader.biSize = sizeof(bmpData.bmiHeader); bmpData.bmiHeader.biHeight = -bmpSizeInfo.bmHeight; bmpData.bmiHeader.biWidth = bmpSizeInfo.bmWidth; bmpData.bmiHeader.biPlanes = bmpSizeInfo.bmPlanes; bmpData.bmiHeader.biBitCount = bmpSizeInfo.bmBitsPixel;

  3. 创建足够的堆内存来保存位图的数据: pBuff = new char[bmpSizeInfo.bmWidth * bmpSizeInfo.bmHeight * 4];

  4. 像这样获取位图数据: ::GetDIBits(hDc, hBmp, 0, bmpSizeInfo.bmHeight, (void*)pBuff, &bmpData, DIB_RGB_COLORS);

  5. 创建一个D2D1_BITMAP_PROPERTIES 并像这样填充它: bmpPorp.dpiX = 0.0f; bmpPorp.dpiY = 0.0f; bmpPorp.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM; bmpPorp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE;

  6. 使用渲染目标将数据转换为 ID2D1Bitmap pRT->CreateBitmap(bmpSize, pBuff, 4 * bmpSizeInfo.bmWidth, bmpPorp, &pBmpFromH);

希望这能有所帮助。

山姆

【讨论】:

  • 太好了,这就是我要找的。很长一段时间我都在键盘上敲打我的头。
  • @Ram 不要忘记删除在堆中创建的缓冲区 (pBuff),例如 delete[] pBuff;
  • 所以仅仅在内存中创建一个位图并使用 Direct2D 渲染它不会打开 WIC-Worms 的罐头,对吧?! :)
  • @BitTickler 你是对的,这个方法直接将图像从 GDI 的 HBITMAP 转换为 ID2D1Bitmap。不涉及 WIC。
猜你喜欢
  • 1970-01-01
  • 2017-03-26
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
相关资源
最近更新 更多