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

How to convert a image file loaded in memory to a ID2D1Bitmap in C++

本文关键字:图像 文件 转换 ID2D1Bitmap 加载 C++ 内存      更新时间:2023-10-16

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

该文件在内存中是原始的,我希望避免将hdd中的图像提取到临时文件中,只是为了从中读取它们的数据。

有什么想法吗?

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

希望这能有所帮助。

Sam