使用D3DXLOADSURFAFROMEMORY加载位图
load BITMAP with D3DXLoadSurfaceFromMemory
这是我失败的尝试:
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_INVALIDCALL
。
这是一些调试信息:
RenderTargetSurface属性:
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>
BMP属性:
bmType = 0, bmWidth = 124, bmHeight = 124,
bmWidthBytes = 496, bmPlanes = 1, bmBitsPixel = 32, bmBits = 0x00000000
我在这里做错了什么?
bmp.bmBits
为null。您需要将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)));
相关文章:
- 如何从路径字符串加载Gdiplus::位图
- 如何从资源文件(.rc 文件)加载位图?
- 尝试从资源加载位图返回NULL,错误代码为1813
- 使用D3DXLOADSURFAFROMEMORY加载位图
- 从C#(64位)加载C 类库
- 正在将位图加载到窗口
- c++ GDI 位图不想加载
- 无法从资源加载位图
- 如何在不使用外部库的情况下加载到 8 位C++位图图像
- 将 LLVM 位码加载到模块中:无法将"std::unique_ptr<llvm::Module>"转换为"llvm::Module*"
- 直接2D 加载和绘制位图
- 无法从内存正确加载位图
- 在SDL中对X位图加载器进行编码
- 在C++中加载位图时出现Big Endian问题
- 64位Matlab加载库
- Directx 位图无法加载
- 当切换到向量而不是数组时,位图加载中断
- 如何在SDL上加载原始像素位图
- OpenCV / Tesseract:如何用GDI+位图替换libpng, libtiff等(通过GDI+加载到cv::
- 用位矩阵加载向量