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

我试图将一个图像文件(一个PNG,但可能是任何东西),我刚刚从一个压缩文件提取到内存中的一个ID2D1Bitmap使用Direct 2D进行绘制。 我试图寻找一些文档,但我只能find接收“const char *path”的方法,或者问我的图像的宽度和高度,以前我不知道。 在谷歌search它让我无处。

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

有任何想法吗?

Solutions Collecting From Web of "如何将内存中加载的图像文件转换为C ++中的ID2D1Bitmap"

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

希望这可以帮助。

山姆