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

4
我正在尝试将刚从压缩文件中提取到内存中的图像文件(png格式,但也可能是其他格式)转换为ID2D1Bitmap以便使用Direct 2D进行绘制。我尝试查找一些文档,但我只能找到接收“const char * path”或要求我提供图像宽度和高度的方法,而这些信息我事先无法获得。在Google上搜索也没有任何结果。
该文件已在内存中,我希望避免将图像提取到临时文件中再从那里读取数据。
有什么想法吗?

1
使用WIC从IWICStream加载它,然后使用CreateBitmapFromWicBitmap获取您的ID2D1Bitmap - MSDN上有示例,所以我很惊讶您没有找到任何内容。 - Roger Rowland
你需要首先解码图像(例如使用WIC)以获取原始的RGB32像素数据(可以在内存中完成),然后才能使用CreateBitmap()函数(http://msdn.microsoft.com/en-us/library/windows/desktop/jj841129%28v=vs.85%29.aspx)。你应该将指向已解码图像的指针传递给srcData参数。 - Anton Angelov
1个回答

6

如果您有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


太好了,这正是我一直在寻找的。长时间对着键盘苦思冥想。 - iamrameshkumar
1
@Ram 别忘了删除在堆中创建的缓冲区 (pBuff),像这样 delete[] pBuff; - Sam
仅仅在内存中创建位图并使用Direct2D渲染它并不能打开WIC-Worms的罐头,对吧?! :) - BitTickler
@BitTickler 没错,这种方法直接将图像从GDI的HBITMAP转换为ID2D1Bitmap。没有涉及到WIC。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接