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

时间:2014-10-02 11:05:23

标签: 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”。

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

你能帮忙解释为什么在第一种情况下没有加载bmp文件吗?如何使用“LoadImage”函数使生成的QRCode图像正确加载,而无需使用转换为24位Bitmap图像MS Paint。如果它易于打印.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 is null”。

1 个答案:

答案 0 :(得分:1)

  

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

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

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

  

如何使用" LoadImage"正确加载生成的QRCode图像?无需使用MS Paint转换为24位位图图像即可运行。

我认为您无法在不转换文件的情况下使用LoadImage执行此操作。现代版本的Windows有其他API可以加载BMP(以及PNG和JPG),因此您可以尝试其中一种。

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

另请告诉我是否可以轻松打印.jpg或.png图片而不是.bmp文件。

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