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

LoadImage() with QRCode bitmap failing unless file is opened/saved with MS Paint first

本文关键字:位图 QRCode LoadImage 失败 MS Paint 保存文件 打开      更新时间:2023-10-16

我正在尝试使用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文件是否容易。

谢谢Abhinay

编辑我已经尝试使用下面提到的"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);
    }
}

我得到错误消息"getlasterrorisnull"。

你能帮我解释一下第一种情况下没有加载bmp文件的原因吗?

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

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

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

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

  • GDI+(可能是最简单的)
  • WIC
  • OLE(可能是最复杂的,尤其是如果你不习惯COM的话)

还请告诉我打印.jpg或.png图像而不是.bmp文件是否容易。

如果您使用我列出的其中一个API来加载图像,那么打印它应该非常简单。