【问题标题】:Qt: Saving an image in intended compression formatQt:以预期的压缩格式保存图像
【发布时间】:2017-12-24 20:10:29
【问题描述】:

我正在使用Qt 并从QML UI 项中保存图像文件。以下是我的工作

auto screenshot = quick_item->grabToImage();
screenshot->saveToFile("/somepath/filename.jpeg");
// OR sometimes use like png like
screenshot->saveToFile("/somepath/filename.png");

这在所有平台上都非常有效。我按预期打开图像保存的文件。

现在我的问题是:
我刚刚提到.jpeg 作为文件扩展名,同时将文件名作为参数提供给saveToFile。这可行,但我是否需要使用QImageWriter 来确保图像实际上以jpeg/png 格式压缩?

当它是像jpeg 这样的有损压缩时会发生什么?
如果我想在android中控制有损压缩,我可以做一个image.compress(CompressFormat.JPEG, 80, stream),其中80是percentage of quality for Compress

【问题讨论】:

    标签: qt qml png jpeg image-compression


    【解决方案1】:

    您不能直接从 QQuickItemGrabResult 执行此操作,您必须使用 QImage::save()

    auto screenshot = quick_item->grabToImage();
    auto image = screenshot->image();
    image.save("/somepath/filename.jpeg", nullptr, 80);
    

    save的第二个参数是格式,可以留空,然后根据文件扩展名猜测,第三个是压缩质量。

    如果您使用像 png 这样的无损格式,则品质因数没有影响。您可以将其设置为-1(默认值),省略参数或使用您将用于有损格式的因子。

    编辑:正如@Arsenal 所指出的,质量因子映射到无损格式(支持它的格式)的压缩级别。例如,在 PNG 中,质量 0 映射到 PNG 压缩级别 9(最小文件大小),而 100 映射到 PNG 压缩级别 0(最大文件大小)。 Qt 中 PNG 的默认质量是 50,映射到 PNG 压缩级别 4。

    【讨论】:

    • 不错。如果我还保存像png 这样的无损格式,我需要这样做吗?这也是我的问题的一部分
    • 看起来像 QImage::Format:: 我可以输入而不是 nullptr 有大量的格式选择?我应该选择什么?我正在保存一个图像,它是具有多种颜色的彩色图像,我希望所有颜色都按原样显示
    • @HAL9000-Kernel 我编辑了我的答案。 QImage::Format 也是关于图像格式的,而不是 jpeg 或 png 等文件格式。图像具有您不需要更改的图像格式。您可以放置​​的文件格式而不是 nullptr 是格式的名称,例如 "PNG""JPEG",如下所述:doc.qt.io/qt-5/qimage.html#reading-and-writing-image-files
    • screenshot->saveToFile("/somepath/filename.png") 也像我在问题中所说的那样工作。我打开保存的文件,它包含的数据很好,如果我不按照你的方式拍摄图像并在使用 .png 作为文件扩展名时调用保存,我该怎么办?
    • 没什么。 screenshot->saveToFile("/somepath/filename.png")screenshot->image().save("/somepath/filename.png") 做同样的事情。不需要文件格式,因为它可以通过 png 扩展名猜测,并且质量因子没有用,因为它是无损的。
    猜你喜欢
    • 1970-01-01
    • 2015-02-02
    • 2017-07-19
    • 1970-01-01
    • 2012-06-14
    • 2015-01-05
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    相关资源
    最近更新 更多