【发布时间】:2013-10-29 11:57:08
【问题描述】:
我想将以前使用 GDI+ 加载的图像加载到 Direct X 中;可能吗?我知道我可以将图像保存到磁盘,然后使用:
D3DXLoadSurfaceFromFile
但我想用
D3DXLoadSurfaceFromMemory
将 GDI+ 图像加载到内存中; GDI+ 图像是 GdiPlus::Image 类型。
我正在使用 Visual C++ 2010。
提前致谢。
更新:
using namespace Gdiplus;
std::string decodedImage = base64_decode(Base64EncodedImage);
DWORD imageSize = decodedImage.length();
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
LPVOID pImage = ::GlobalLock(hMem);
memcpy(pImage, decodedImage.c_str(), imageSize);
IStream* pStream = NULL;
::CreateStreamOnHGlobal(hMem, FALSE, &pStream);
Image image(pStream);
上面的代码让我将base64(Base64EncodedImage)编码的图像转换为GDI+图像;到目前为止一切顺利,接下来我将图像转换为字节数组(buffer):
int stride = 4 * ((image.GetWidth() + 3) / 4);
size_t safeSize =
stride * image.GetHeight() * 4 + sizeof(BITMAPINFOHEADER) +
sizeof(BITMAPFILEHEADER) + 256 * sizeof(RGBQUAD);
HGLOBAL mem = GlobalAlloc(GHND, safeSize);
LARGE_INTEGER seekPos = {0};
ULARGE_INTEGER imageSizeEx;
HRESULT hr = pStream->Seek(seekPos, STREAM_SEEK_CUR, &imageSizeEx);
BYTE* buffer = new BYTE[imageSizeEx.LowPart];
hr = pStream->Seek(seekPos, STREAM_SEEK_SET, 0);
hr = pStream->Read(buffer, imageSizeEx.LowPart, 0);
附带说明一下,我可以将字节数组作为 png 图像保存到磁盘而不会丢失,然后使用 D3DXLoadSurfaceFromFile 加载它。
接下来我创建并加载表面:
hr = d3ddevex->CreateOffscreenPlainSurface(image.GetWidth(), image.GetHeight(), D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &surf, NULL);
RECT srcRect;
srcRect.left = 0;
srcRect.top = 0;
srcRect.bottom = image.GetWidth();
srcRect.right = image.GetHeight();
hr = D3DXLoadSurfaceFromMemory(surf, NULL, NULL, buffer, D3DFMT_X8R8G8B8,image.GetWidth(), NULL, &srcRect,D3DX_FILTER_NONE,0);
这是可行的,但是图像到处都是杂乱无章的彩色像素,但根本不是“可读”图像(就像街机游戏中的测试图案一样)。
【问题讨论】: