c++ - 如何在 C++ 中将加载到内存中的图像文件转换为 ID2D1Bitmap

标签 c++ windows direct2d imaging

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

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

有什么想法吗?

最佳答案

如果你有 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);

希望对您有所帮助。

山姆

关于c++ - 如何在 C++ 中将加载到内存中的图像文件转换为 ID2D1Bitmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26566849/

相关文章:

c++ - 检查模板参数是否为 "true"可调用对象的正确方法是什么?

c++ - CMake 链接不正确?

mysql - 是否可以使用 mongrel 创建delayed_job 作为Windows 服务?

c# - C# 中的平滑视频渲染

winapi - "1"中的 "D2D1"代表什么?

c++ - 在两个 Qt 窗口之间发送事件

c++ - 如何检测用户是否在 C++(控制台)中按下了任何键?

windows - ssh 在 Windows 命令提示符下验证了 git 访问?

javascript - Windows Mobile 上的媒体查询检测

graphics - Skia 或 Direct2D 如何使用 GPU 渲染线或多边形?