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:以预期的压缩格式保存图像的主要内容,如果未能解决你的问题,请参考以下文章