(Bitmap)LoadImage()返回NULL,GetLastError()返回0

时间:2019-09-29 04:56:02

标签: c++ winapi

我正在尝试在窗口上绘制位图文件。所以我用了(HBITMAP)LoadImage()并且它返回NULL。 我使用GetLastError来查看问题,但它也返回0。 我正在研究goorm ide(Windows应用程序)。

    HBITMAP hBitmap = NULL;
    hBitmap = (HBITMAP)LoadImageW( NULL, L"C:\\Users\\Asd\\Downloads\\image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );

    if(hBitmap == NULL){
        DWORD errorCode = GetLastError();
        if(errorCode != 0){
            LPSTR messageBuffer = nullptr;
            FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL,
                errorCode,
                0,
                (LPTSTR)&messageBuffer,
                0,
                NULL);
                MessageBox(NULL, messageBuffer, "hBitmap is NULL!" , MB_OK);
                }else{
                    MessageBox(NULL, "hBitmap is null but errorCode is 0", "???" , MB_OK);
                }
            }

如果在代码中将“ image.bmp”更改为“ asdf.bmp”,则会显示“没有文件”。因此,我确定它找到了文件,但似乎无法正常工作。当我打印位图的宽度和高度时,它显示了一个奇怪的数字(如12312321,-3453453)。我找不到问题所在。

我也尝试过: (来自https://support.microsoft.com/en-us/help/158898/howto-how-to-use-loadimage-to-read-a-bmp-file

hBitmap = (HBITMAP)LoadImage( NULL, "image.bmp", IMAGE_BITMAP, 0, 0,
               LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );

2 个答案:

答案 0 :(得分:0)

我创建了最简单的Windows桌面应用程序。

并且仅添加了WM_CREATEWM_PAINT消息事件。

我添加了自己的bmp图像,并且可以成功加载该图像。

赞:

hBitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), L"C:\\Users\\strives\\Desktop\\panda.bmp", IMAGE_BITMAP, 0, 0,
            LR_DEFAULTSIZE | LR_LOADFROMFILE);

从注释中的答案中,您尝试使用绝对路径加载图像,但是您没有考虑任何问题。这就是图像格式,如果您只是将JPG图像的后缀更改为.bmp,那么您的hBitmap将返回0,而GetLasterror也将返回0。

因此,您要做的就是使用格式正确的BMP图像。如果没有此类图像,请使用图像转换格式工具进行转换。

此外,我之前也遇到过类似的post,您可以参考。

答案 1 :(得分:0)

通过 BOOL LoadBitmap(UINT nIDResource) 和 GIMP 创建的 bmp 得到这个。将资源 bmp 文件加载到 Paint 并进行一些伪更改以说服 Paint 您更改了 bmp。保存 bmp。问题迎刃而解!我没有深入研究以找到根本原因。 LoadBitmap 不喜欢 GIMP 创建的 bmp 文件。