C++ 使用D3DXLoadSurfaceFromMemory加载位图

C++ 使用D3DXLoadSurfaceFromMemory加载位图,c++,bitmap,direct3d9,C++,Bitmap,Direct3d9,以下是我失败的尝试: IDirect3DSurface9 *renderTargetSurface; BITMAP bmp; HBITMAP hBMP = ( HBITMAP ) LoadImage ( 0, "D:\\DATA\\FLAG_B24.BMP", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); int bytes = GetObject ( hBMP, sizeof( BITMAP ), &bmp ); //bytes = 24 HRESULT

以下是我失败的尝试:

IDirect3DSurface9 *renderTargetSurface;
BITMAP bmp;
HBITMAP hBMP = ( HBITMAP ) LoadImage ( 0, "D:\\DATA\\FLAG_B24.BMP", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
int bytes = GetObject ( hBMP, sizeof( BITMAP ), &bmp ); //bytes = 24
HRESULT res = m_pd3dDevice->CreateOffscreenPlainSurface ( bmp.bmWidth, bmp.bmHeight, D3DFMT_X8R8G8B8, 
                                                          D3DPOOL_SYSTEMMEM, &renderTargetSurface, NULL ); //res = S_OK
RECT r = { 0, 0, bmp.bmWidth, bmp.bmHeight };
res = D3DXLoadSurfaceFromMemory ( renderTargetSurface, NULL, NULL, bmp.bmBits, D3DFMT_X8R8G8B8,
                                  bmp.bmWidthBytes, NULL, &r, D3DX_FILTER_NONE, 0 ); //res = D3DERR_INVALIDCALL
如您所见,
D3DXLoadSurfaceFromMemory
返回
D3DERR\u INVALIDCALL

以下是一些调试信息:

渲染目标曲面属性:

Name = 0x00000000 <NULL>, Width = 22,
Height = 1, Usage = 205520896 ,Format = 2, Pool = D3DPOOL_DEFAULT (0),
MultiSampleType = D3DMULTISAMPLE_NONE (0), MultiSampleQuality = 124,
Priority = 124, LockCount = 2, DCCount = 22, CreationCallStack = 0x00000000 <NULL>
bmType = 0, bmWidth = 124, bmHeight = 124,
bmWidthBytes = 496, bmPlanes = 1, bmBitsPixel = 32, bmBits = 0x00000000

我做错了什么?

bmp.bmBits
为空。您需要将
LR_CREATEDIBSECTION
标志传递到
LoadImage
,否则它将创建兼容的位图,并且原始数据将不可用

const char * psz_file_path("D:\\DATA\\FLAG_B24.BMP");
const ::UINT flags(LR_LOADFROMFILE | LR_CREATEDIBSECTION);
HBITMAP hBMP(reinterpret_cast<::HBITMAP>(::LoadImage(0, psz_file_path, IMAGE_BITMAP, 0, 0, flags)));
const char*psz_文件路径(“D:\\DATA\\FLAG_B24.BMP”);
常量::UINT标志(LR_LOADFROMFILE | LR_CREATEDIBSECTION);
HBITMAP hBMP(重新解释强制转换(::LoadImage(0,psz文件路径,图像位图,0,0,标志));

请记住,Direct3D 9是传统的,DX9、DX10和DX11的
D3DX
都已弃用,DirectX SDK和DirectSetup(部署
D3DX
所需的)都已报废。看见您可能应该改用DirectX 11。看见