D3DXLoadSurfaceFromMemory + GDI+:如何显示图像
D3DXLoadSurfaceFromMemory + GDI+: How to Show Image?
我想加载以前使用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版本中复制数据。为了绘制图像,你需要设置一些几何形状(三角形),形成一个四边形,并将其传递给管道(谷歌"全屏四边形"了解更多细节)。
SrcPicht参数为img.GetWidth()*4,单位为字节:
hr = D3DXLoadSurfaceFromMemory(
spSurface,
NULL,
&rectDes,
bd.Scan0,
D3DFMT_X8R8G8B8,
image.GetWidth()*4, //@ here is different only
NULL,
&rectSrc,
D3DX_FILTER_NONE,0);
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 我在 OpenGL 中显示图像时遇到问题
- 无法在 Opencv 中显示图像导致内存位置
- 从C++调用网络摄像头并在 Python 中显示图像
- C++列出屏幕以在第二台显示器中显示图像
- 如何用QT显示图像
- 如何在 QGraphicsView 中显示图像
- C++/openCV - 为什么显示图像会产生 Linux 分割错误?(打开CV错误?
- 在C 中显示图像及其元数据
- C++显示图像并将其保持到下一张图像的最佳方法
- 如何使用SDL_surface在用户定义的矩形上显示图像?
- 如何使用QVector的QPixmap显示图像?
- 如何在任何使用 Opencv 的计算机上显示图像
- 使用 qt 和 opengl、定时精度和垂直同步问题、c++ 显示图像
- QLabel像视频一样显示图像
- 使用 c++ 显示图像
- Qt表查看单元格中的显示图像并在单击时获取路径
- 在Visual C 控制台应用程序中显示图像
- 如何使用Createbsection显示图像