c++ - D3DXLoadSurfaceFromMemory + GDI+ : How to Show Image?

标签 c++ directx gdi+

我想将之前使用 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+ 图像;到目前为止一切顺利,接下来我将图像转换为字节数组(缓冲区):

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);

这是有效的,但图像到处都是无序的彩色像素,但根本不是“可读”图像(就像街机游戏中的测试图案一样)。

最佳答案

您需要确定合适的 DirectX 纹理格式(例如 DXGI_FORMAT_R32G32B32A32_UINT),以便 DirectX 纹理可以从 GDI+ 接收数据而无需修改。您可以使用 ID3D11DeviceContext::CopyResource() 或您使用的任何版本的 DirectX 中的等效项复制数据。 要绘制图像,您需要设置一些形成四边形的几何体(三角形)并将其传递给管道(谷歌“全屏四边形”了解更多详细信息)。

关于c++ - D3DXLoadSurfaceFromMemory + GDI+ : How to Show Image?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8405711/

相关文章:

c++ - 找不到命令时出现段错误

c++ - Visual Studio (std::cout) 不打印我的变量值

c++ - 在大型二进制文件 C++ 中查找 int 值

c++ - Direct3D Sprite->SetTransform 用法?

c# - 在托管代码和非托管代码之间共享 Graphics 对象时丢失抗锯齿

c# - 在 DLL 上使用 WPF 动态创建图像(而不是 GDI+)

c++ - 使用OpenCV和C++将模板图像与蒙版匹配

winapi - IDirectSoundBuffer锁,为什么要传递2部分?

graphics - block 压缩图像如何始终具有 4 倍数的第一个 mip 级别?

c# - Matrix.RotateAt 方法对于某些角度是否存在错误? .Net Winforms