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

标签 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 位位图中的 .bmp,现在我可以使用上面相同的“LoadImage”函数加载文件。

你能帮忙解释为什么在第一种情况下没有加载 bmp 文件吗?我怎样才能使用“LoadImage”函数正确加载生成的 QRCode 图像,而不需要使用转换为 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 is null”。

最佳答案

Can you please help why the bmp file was not loaded in the first case?

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

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

how can i make the the generated QRCode image to be loaded properly loaded using "LoadImage" function without the need of converting into 24-bit Bitmap image using MS Paint.

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

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

Also let me know if its easy to print a .jpg or .png image instead of a .bmp file.

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

关于c++ - 除非首先使用 MS Paint 打开/保存文件,否则带有 QRCode 位图的 LoadImage() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26159489/

相关文章:

c++ - g++ 创建一个 const 的几个符号?

c++ - 尝试优化我的 if 语句

c++ - 无法使用迭代器迭代具有数组类型的 GVariant

c# - 如何调出内置文件复制对话框?

delphi - JclShell.ShellLinkResolve 获取错误数据

php - 从 Android 中的 Web 服务恢复 base64 图像

C++ 容器选择/选择

c++ - 程序崩溃并显示 0xC000000D 并且没有异常 - 我该如何调试它?

android - 不需要的 textview 的位图轮廓

c++ - 如何将游标的 x,y 的 LONG 转换为逻辑单位