nakamuraFan 2023-10-19 18:12 采纳率: 0%
浏览 19

QImage load24位深度图片时为什么自动转成了RGB32?

我在自己的项目里写一个读写图片功能时,发现QImage::load读取的格式和我当初save的格式竟然不一样!于是我写了下面一个demo,发现真的不一样


    QImage image(100, 100, QImage::Format_RGB888);
    image.save("d:/test.bmp");
    auto type = image.format();
    int depth = image.depth();

    QImage image2;
    image2.load("d:/test.bmp", "BMP");
    image2.save("d:/test2.bmp");
    auto type2 = image2.format();
    int depth2 = image2.depth();

直接创建一个RGB888格式24位深的QImage,存成BMP图片,然后立刻再读回QImage,对比两个QImage的format和depth
image的format = RGB888,depth=24
image2的format = RGB32,depth=32
为什么同一张图经过save、load之后格式就变了?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-19 20:05
    关注

    【以下回答由 GPT 生成】

    问题的答案是:当使用QImage::load加载一张图片时,如果该图片的颜色格式不在QImage支持的范围内,它会自动转换为一个最接近的格式。

    在这种情况下,从24位深度(RGB888格式)的图片加载时,它会转换为32位深度(RGB32格式),因为32位深度是QImage支持的格式之一。

    在这里,我们可以使用QImageReadersupportsOption()函数来检查是否支持RGB888格式,以了解为什么图片不能以原始的格式加载。我们可以使用以下代码进行验证:

    QImageReader reader("d:/test.bmp", "BMP");
    if (reader.supportsOption(QImageIOHandler::Size)) {
        qDebug() << "RGB888 is supported";
    } else {
        qDebug() << "RGB888 is not supported";
    }
    

    如果打印出"RGB888 is not supported",那么说明QImageReader不能直接加载RGB888格式的图片。这也是为什么在使用QImage::load加载时会自动转换为RGB32格式的原因。

    然而,如果我们仍然想保留24位深度(RGB888格式)的图片格式,我们可以使用QImageReaderQImageWriter来实现手动加载和保存图片。下面是一段示例代码:

    QImageReader reader("d:/test.bmp", "BMP");
    reader.setAutoTransform(false);
    reader.setDecideFormatFromContent(false);
    reader.setPreferredImageFormat(QImage::Format_RGB888);
    QImage image2 = reader.read();
    image2.save("d:/test2.bmp", "BMP");
    

    在这个示例中,我们禁用了自动变换和自动决定图片格式的功能,并将首选的图片格式设置为RGB888。这样,加载的图片将保持原始的24位深度(RGB888格式)。

    总结一下,当直接使用QImage::load函数加载图片时,如果图片的颜色格式不在QImage支持的范围内,它会自动转换为一个最接近的格式。如果想要手动加载和保存图片时保留原始格式,可以使用QImageReaderQImageWriter来实现。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月19日

悬赏问题

  • ¥15 从Freecad中宏下载的DesignSPHysics,出现如下问题是什么原因导致的(语言-python)
  • ¥30 notepad++ 自定义代码补全提示
  • ¥15 MATLAB有限差分法解一维边值问题
  • ¥200 内网渗透测试 横向渗透 Windows漏洞 Windows权限维持
  • ¥15 数据结构图的相关代码实现
  • ¥15 python中aiohttp.client_exceptions.ContentTypeError
  • ¥30 DeepLung肺结节检测生成最大froc值对应的epoch报错
  • ¥15 信号发生器如何将频率调大,步尽值改成10
  • ¥15 keil 5 编程智能家具,风扇台灯开关,人体感应等
  • ¥100 找一名渗透方面的专家