C++ 除非先用MS Paint打开/保存文件,否则带有QRCode位图的LoadImage()将失败

C++ 除非先用MS Paint打开/保存文件,否则带有QRCode位图的LoadImage()将失败,c++,winapi,bitmap,qr-code,C++,Winapi,Bitmap,Qr Code,我正在尝试使用c中的以下函数读取bmp文件++ HANDLE hBmp = LoadImage(0, L"C:\\Users\\abhinay\\Desktop\\Sample.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); 在我的场景中,sample.bmp是由第三部分QRCode库生成的QRCode。当我尝试读取上面的“LoadImage”函数生成的QRCode时,我得到的hBmp为“NULL” 我用

我正在尝试使用c中的以下函数读取bmp文件++

HANDLE hBmp = LoadImage(0, L"C:\\Users\\abhinay\\Desktop\\Sample.bmp", IMAGE_BITMAP, 0, 0,    LR_CREATEDIBSECTION | LR_LOADFROMFILE);
在我的场景中,sample.bmp是由第三部分QRCode库生成的QRCode。当我尝试读取上面的“LoadImage”函数生成的QRCode时,我得到的hBmp为“NULL”

我用MS paint打开了QRCode图像“sample.bmp”,并将其保存为24位位图中的.bmp,现在我可以使用上面相同的“LoadImage”函数加载该文件

您能否帮助解释为什么在第一种情况下未加载bmp文件,以及如何使用“LoadImage”功能正确加载生成的QRCode图像,而无需使用MS Paint将其转换为24位位图图像。另外,请告诉我打印.jpg或.png图像而不是.bmp文件是否容易

谢谢 阿比奈

编辑 我已经尝试使用下面提到的“GetLastError()”

HANDLE hBmp = LoadImage(NULL, bmpfile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

if (hBmp == NULL)
{
    DWORD dw = GetLastError();
    if (dw == NULL)
    {
        MessageBoxA(NULL, "get last error is null", "ABHINAY", MB_OK | MB_TOPMOST);
    }
    else
    {
        MessageBoxA(NULL, "get last error is not null", "ABHINAY", MB_OK | MB_TOPMOST);
    }

}
我得到错误消息“get last error为null”

您能帮助解释为什么在第一种情况下没有加载bmp文件吗

BMP格式有很多变体。很可能原始图像是LoadImage无法直接转换为DIB的变体。因此,您在Paint中将其转换为可以打开的BMP变体

特别是,有些变体可以将JPG数据的原始PNG打包到BMP容器中。这通常用于将压缩后的图像数据直接传递给可自行解压缩的打印机。(以我的经验,实际上只有少数打印机支持这一点。)我认为GDIAPI实际上不能用这种类型的BMP做很多其他事情。另一方面,Paint有PNG和JPG的编解码器,所以我希望它的曲目可能包括这些格式,即使它们打包在BMP头中

如何使用“LoadImage”功能正确加载生成的QRCode图像,而无需使用MS Paint将其转换为24位位图图像

我认为如果不转换文件,就无法使用LoadImage完成此操作。现代版本的Windows还有其他可以加载BMP(以及PNG和JPG)的API,所以您可以尝试其中一种

  • (可能是最简单的)
  • (可能是最复杂的,特别是如果您不习惯COM)
另外,请告诉我打印.jpg或.png图像而不是.bmp文件是否容易


如果您使用我列出的某个API加载映像,打印它应该非常简单。

:“如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError”。您好,我尝试使用“GetLastError”函数,但仍然没有获得任何调试信息。如果我打开同一个文件并在MS中另存为24 bmp格式,则会加载图像。我认为最初生成的图像不兼容。我想我错过了一些愚蠢的东西,但我无法找到我错过的东西。这是我第一次对图像进行编辑。如果你用文本编辑器(如写字板或记事本)打开原始位图,文件的前两个字符是什么?Windows位图文件的前两个字符通常是BM。@AbhilashAruva GetLastError返回了什么值?您好,谢谢您的回复。我对C++中的这些图像很陌生。我已找到解决此问题的方法。我正在从我的库中生成JPEG格式的图像,然后使用gdi+将该图像转换为bmp格式。loadImage函数现在可以加载新的bmp图像。谢谢你的帮助。