是否可以判断 JPEG 的质量级别?
Posted
技术标签:
【中文标题】是否可以判断 JPEG 的质量级别?【英文标题】:Is it possible to tell the quality level of a JPEG? 【发布时间】:2011-01-02 18:07:18 【问题描述】:这实际上是一个两部分的问题,因为我还不完全理解这些事情是如何工作的:
我的情况:我正在编写一个允许用户上传图像的网络应用程序。然后,我的应用调整为可显示的大小(例如:640x480-ish)并保存文件以供以后使用。
我的问题:
-
给定一个任意的 JPEG 文件,是否可以分辨出质量级别,以便在保存调整大小的图像时使用相同的质量?
这还重要吗?无论原始质量如何,我是否应该将所有图像保存在一个不错的水平(例如:75-80)?
我不太确定这一点,因为我认为:(让我们举一个极端的例子),如果有人以质量 0 保存 5 兆像素的图像,它会像任何东西一样块状。将图像尺寸减小到 640x480,块状将被平滑,并且几乎没有不那么明显......直到我再次以质量 0 保存它......
另一方面,如果存在 800x600 且 q=0 的图像,则将大小调整为 640x480 并不会改变它看起来完全是废话的事实,因此使用 q=80 保存将是多余的。
我还接近吗?
如果有用的话,我正在 php 上使用 GD2 库
【问题讨论】:
nickf 您能否接受@DuyLuc 的使用 identify -format '%Q' 的答案?与当前接受的答案不同,它回答了问题。刚刚在我的文件上尝试过,它可以工作。谢谢! 【参考方案1】:如果您相信 Irfanview 估计的 JPEG 压缩级别,您可以从由以下 Windows 行命令创建的信息文本文件中提取该信息(您到 i_view32.exe
的路径可能不同):
"C:\Program Files (x86)\IrfanView\i_view32.exe" <image-file> /info=txtfile
【讨论】:
【参考方案2】:这里有一些方法可以实现您的 (1) 并做到正确。
有一些方法可以通过拟合量化表来做到这一点。 Sherloq - 例如 - 这样做:
https://github.com/GuidoBartoli/sherloq
相关(python)代码位于https://github.com/GuidoBartoli/sherloq/blob/master/gui/quality.py
https://arxiv.org/abs/1802.00992 中写了另一种算法 - 您可以考虑联系作者获取任何代码等。
您还可以模拟file_size(image_dimensions,quality_level)
,然后反转该函数/查找表以获得quality_level(image_dimensions,file_size)
。嘿,快!
最后,您可以采用蛮力https://en.wikipedia.org/wiki/Error_level_analysis 方法,通过计算原始图像和以不同质量级别保存的重新压缩版本之间的差异。原件的质量水平大致是差异最小化的水平。似乎工作得相当好(但在 for 循环中是线性的..)。
通常使用的品质因数似乎是 75 或 95,这可能有助于您更快地获得结果。可能没有人会将 JPEG 保存为 100。可能也没有人会有用地将其保存为
我可以添加其他可用的链接 - 请把它们放在 cmets 中。
【讨论】:
【参考方案3】:您可以使用 ImageMagick 中的identify
工具查看压缩级别。下载和安装说明可以在official website找到。
安装后,从命令行运行以下命令:
identify -format '%Q' yourimage.jpg
这将返回一个从 0(低质量,小文件大小)到 100(高质量,大文件大小)的值。
Information source
【讨论】:
您要在输出中查找的特定项目是 Quality: 项目,它出现在 Properties: 部分之前,其中包含所有 EXIF 数据。在最高质量下,此值为 100。 @OranDennison 您的评论模棱两可,让我在 EXIF 数据中寻找“质量”标签。但是没有:“质量”是identify -verbose
输出的一个特征。
我不明白为什么这个答案没有被标记为解决方案???它真的把它钉在了没有任何废话的地方。
@basZero 因为虽然 ImageMagick 返回的质量评估编号并不意味着它是正确的。 请参阅 jpeg 创建者自己的faqs.org/faqs/jpeg-faq/part1/section-5.html 和photo.stackexchange.com/questions/88167/…【参考方案4】:
JPEG 是一种有损格式。每次保存 JPEG 相同图像时,无论质量级别如何,都会降低实际图像质量。因此,即使您确实从文件中获得了质量级别,当您再次保存 JPEG 时(即使质量=100)也无法保持相同的质量。
就文件大小而言,您应该以尽可能高的质量保存 JPEG。或者使用无损格式,例如 PNG。
低质量的 JPEG 文件不会变得更加块状。取而代之的是减少了颜色深度,并删除了图像部分的细节。您不能依赖低质量的图像块状并且在较小的尺寸下看起来还可以。
根据JFIF spec.,质量编号(0-100)不存储在图像标题中,但存储了水平和垂直像素密度。
【讨论】:
+1,通常情况下,重新保存 JPEG 会降低质量,但在某些受限情况下可以解决此问题 - 请参阅 en.wikipedia.org/wiki/Jpeg#Lossless_editing。例如。 Irfanview 有一个无损 JPEG 裁剪/旋转插件。 你知道这是否同样适用于 mpeg 视频吗? @johnny,MPEG2(我相信 MPEG4)也使用有损压缩,因此多次重新编码会降低质量。不确定压缩级别是否存储在 MPEG 标头中。 压缩过程中实际发生损失的唯一地方是(可能)舍入误差和量化步骤。如果量化可以相同地执行并且数学以足够的精度完成,则可以保证质量不会降低。这里的主要问题是标准没有精确定义 AFAIK 如何执行量化步骤.我们必须对未使用已知编码器编码的文件进行某些猜测。实践中当然还有其他因素,但对于 OP 的用例来说,至少在技术上是可行的。 这个答案怎么可能是解决方案?它根本没有回答这个问题。【参考方案5】:由于已经有两个使用identify
的答案,这里有一个还输出文件名(用于一次扫描多个文件):
如果您希望将filename: quality
的简单输出用于多个图像,您可以使用
identify -format '%f: %Q' *
到当前目录中所有文件的show the filename + compression。
【讨论】:
【参考方案6】:对于未来的访问者,检查给定 jpeg 的质量,您可以使用 imagemagick 工具:
$> identify -format '%Q' filename.jpg
92%
【讨论】:
哇,ImageMagick 甚至可以为您提供 RGB 通道峰度和偏度以及它是否是隔行扫描的!我一直使用identity
,但从不使用-verbose
选项。非常有用。
这个答案与 DuyLuc 的有什么不同?
@jtlz2 如果您仔细检查,您会看到答案已更新,使用类似的解决方案,仅在我在这里发布之后..
@JAR.JAR.beans 多么糟糕! :(
@jtlz2—这个答案添加到 DuyLuc 的是一个 grep Quality
管道,它提取了 Oran Dennison 评论中提到的“质量”项目。 (此后,两个答案都被编辑为使用-format '%Q'
。)【参考方案7】:
这是我发现效果很好的公式:
jpg100size(98-100% 质量不应超过的大小(以字节为单位)= width*height/1.7
jpgxsize = jpg100size*x(x = 百分比,例如 0.65)
因此,您可以使用这些数据统计您的 jpg 最后保存的质量。如果你想把它降低到 65% 的质量,如果你想避免重新采样,你应该首先比较大小以确保它不是太低,然后才降低质量
【讨论】:
很高兴看到其他人一直在玩与我相同的想法。当在我们的 CMS 中使用时,我试图弄清楚 jpeg(或 png)图像的“好”尺寸是多少。我已经对我们数据库中已有的内容进行了一些统计,并且我也一直在玩一些数字。现在我将开始警告用户上传大于 4K 和 32x32 像素的 JPEG 图像并且有面积:字节比 Raul,你是如何计算1.7
系数的?
更像是反复试验,但对于直线公式非常接近【参考方案8】:
所以,你关心的基本上有两种情况:
如果传入图像的质量设置过高,则可能会占用不适当的空间。因此,例如,您可能希望将传入的 q=99 减少到 q=85。
如果传入图像的质量设置过低,则提高其质量可能会浪费空间。除了丢弃大量数据的图像在提高质量时不会神奇地占用更多空间——即使在高质量设置下,块状图像也会很好地压缩。所以,在我看来,将传入的 q=1 提高到 q=85 是完全可以的。
因此,我认为简单地强制设置一个体面的质量设置是完全可以接受的。
【讨论】:
我意识到这是一个相当古老的线程,但你的第二点是不正确的。 Compressed images will often eat more space when re-compressed. @BenD 如果您提高压缩之间的质量,您不会神奇地获得第一个压缩文件中不存在的频率分量。如果在实践中发生这种情况,那么压缩器就不是很智能,因为数据是先验的,已经适当地量化了。我认为这里的问题是该标准允许解码图像中的微小差异,然后第二次可能具有不同的 DCT。使用适当编码的 jpeg 库,第 2 点在理论上和实践中应该是可能的。 @Tim 我可能误解了你的批评,但我相信你在这一点上是错误的。因为 JPEG 压缩通常会产生噪声,并且生成的 JPEG 不会存储它的当前压缩级别,所以二级压缩(即原始 -> 质量 = 60 -> 质量 = 80)通常会大于主压缩。我已经使用 GD 和桌面压缩器运行了这个测试(参见我的原始链接)......因为压缩器无法知道图像的当前压缩状态,所以在运行后续压缩时它不能智能。如果您知道解决此问题的方法,我很想知道。 @BenD 这里最大的问题是压缩中的量化步骤。除非您知道所用压缩器的详细信息,否则可能无法猜测量化期间所做的权衡。此外,由于该标准允许在解压缩期间每个块 IIRC 有 1 位差异,并且不需要以完美的舍入精度完成 DCT,这意味着您基本上是对的。但这些只是非常实际的问题。如果您以机器 epsilon 的精度解压缩 jpeg,然后再次执行 DCT 而不进行量化, 这是一个有趣的讨论。我几乎不介意这意味着我原来的答案是错误的。 :)【参考方案9】:这可能是一个愚蠢的问题,但您为什么要担心对文档质量进行微观管理?我相信如果您使用 ImageMagick 进行转换,它将为您管理 JPEG 的质量以获得最佳效果。 http://www.php.net/manual/en/intro.imagick.php
【讨论】:
我有时想确保艺术家确实提供了未压缩的图像(有好几次他们不小心给了我压缩的 JPEG)。【参考方案10】:JPEG压缩算法有一些参数会影响结果图像的质量。
其中一个参数是量化表,它定义了每个系数将使用多少位。不同的程序使用不同的量化表。
某些程序允许用户设置质量级别 0-100。但是这个数字没有共同的定义。使用 Photoshop 制作的 60% 质量的图像需要 46 KB,而使用 GIMP 制作的图像仅需要 26 KB。
量化表也不同。
还有subsampling、dct方法等其他参数。
所以你不能用单一的质量等级数字来描述所有这些,你不能用单一的数字来比较 jpeg 图像的质量。但是您可以创建像 photoshop 或 gimp 这样的数字,它们将描述尺寸与质量之间的妥协。
更多信息: http://patrakov.blogspot.com/2008/12/jpeg-quality-is-meaningless-number.html
通常的做法是将图像调整为适当的大小,然后再应用 jpeg。在这种情况下,大图像和中图像将具有相同的大小和质量。
【讨论】:
【参考方案11】:如果您使用最初创建 JPEG 的相同软件、使用相同的设置重新保存 JPEG,您会发现损坏最小化 - 该算法倾向于丢弃与第一次丢弃的相同信息。我不认为仅通过查看文件就可以知道选择了哪个级别;即使可以,不同的软件几乎可以保证不同的参数和舍入,几乎不可能匹配。
【讨论】:
【参考方案12】:文件的每次新保存都会进一步降低整体质量,通过使用更高的质量值,您将保留更多的图像。无论原始图像质量如何。
【讨论】:
以上是关于是否可以判断 JPEG 的质量级别?的主要内容,如果未能解决你的问题,请参考以下文章