Qt:以预期的压缩格式保存图像

Posted

技术标签:

【中文标题】Qt:以预期的压缩格式保存图像【英文标题】:Qt: Saving an image in intended compression format 【发布时间】: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?

【问题讨论】:

【参考方案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 扩展名猜测,并且质量因子没有用,因为它是无损的。

以上是关于Qt:以预期的压缩格式保存图像的主要内容,如果未能解决你的问题,请参考以下文章

压缩原始图像缓冲区

jpg.webp是啥格式

图片保存png还是pdf

使用 c# 进行高质量 JPEG 压缩

Web:03-神器Photoshop

JPEG、GIF、PNG、BMP哪种图片格式的图片清晰一点?