【问题标题】:LoadImage() with QRCode bitmap failing unless file is opened/saved with MS Paint first除非首先使用 MS Paint 打开/保存文件,否则带有 QRCode 位图的 LoadImage() 失败
【发布时间】:2014-11-27 08:43:22
【问题描述】:

我正在尝试使用 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 图像,而无需使用转换为 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”。

【问题讨论】:

  • msdn.microsoft.com/en-us/library/windows/desktop/…: "如果函数失败,返回值为NULL。获取扩展错误信息,调用GetLastError"
  • 嗨,我已经尝试使用“GetLastError”功能,但我仍然没有得到任何调试信息。如果我打开相同的文件并在 MS 中保存为 24-bmp 格式,则绘制图像然后加载。我认为生成的图像最初不兼容。我想我错过了一些愚蠢的东西,但我找不到我错过的东西。这是我第一次处理图像。
  • 如果您使用写字板或记事本等文本编辑器打开原始位图,文件的前两个字符是什么? Windows 位图文件通常将 BM 作为文件中的前两个字符。
  • @AbhilashAruva GetLastError 返回了什么值?
  • 您好,感谢您的回复。我对 C++ 中的这些图像很陌生。我找到了解决此问题的解决方法。我正在从我的库中生成 JPEG 格式的图像,然后使用 gdi+ 将此图像转换为 bmp 格式。 loadImage 函数现在能够加载新的 bmp 图像。感谢所有的帮助。

标签: c++ winapi bitmap qr-code


【解决方案1】:

你能帮忙解释一下为什么在第一种情况下没有加载 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 来加载图像,打印它应该非常简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2020-10-19
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多