能否判断JPEG图像的质量水平?

91

这实际上是一个由两个部分组成的问题,因为我还不完全理解这些东西是如何工作的:

我的情况是:我正在编写一个Web应用程序,让用户上传图像。我的应用程序然后调整大小到可显示的尺寸(例如:约为640x480),并保存文件以供以后使用。

我的问题:

  1. 对于任意JPEG文件,是否可以确定其质量级别,以便我在保存调整大小的图像时使用相同的质量级别?
  2. 这真的很重要吗??无论原始质量如何,我都应该将所有图像保存在较高的水平(例如:75-80)吗?

我对此并不十分确定,因为我认为:(让我们举个极端的例子),如果有人有一张以0质量保存的500万像素图像,它看起来会非常模糊。将图像大小缩小到640x480,块状感会被平滑处理并且几乎难以察觉......直到我再次以0质量保存它......

在另一方面,如果有一张800x600且质量为0的图像,缩放到640x480不会改变它看起来像垃圾的事实,因此使用q = 80保存会是多余的。

我接近吗?

我在PHP上使用GD2库,如果有用的话


2
nickf,你能否接受@DuyLuc的答案,它使用了identify -format '%Q'吗?它解决了问题,而当前被接受的答案没有。我刚刚在我的文件上尝试了一下,它可以正常工作。谢谢! - Alex I
13个回答

146
您可以使用 ImageMagick 中的 identify 工具查看压缩级别。下载和安装说明可在 官方网站 找到。
安装完成后,从命令行运行以下命令:
identify -format '%Q' yourimage.jpg

这将返回一个从0(低质量,小文件大小)到100(高质量,大文件大小)的值。 信息来源

2
你在输出中寻找的特定项目是“Quality:”项,它出现在属性部分之前,包含所有的EXIF数据。在最高质量下,这个值将为100。 - Oran Dennison
4
你的评论有歧义,让我查找EXIF数据中的“Quality”标签。但是没有: “Quality”是identify -verbose输出的一个功能。 - Skippy le Grand Gourou
5
为什么这个答案没有被标记为解决方案呢?它真正地明确了问题,没有任何废话。 - basZero
3
@basZero,因为尽管ImageMagick返回了一个质量评估数字,但这并不意味着它是正确的。请参阅jpeg创建者自己发布的http://www.faqs.org/faqs/jpeg-faq/part1/section-5.html和https://photo.stackexchange.com/questions/88167/is-it-possible-to-find-out-what-compression-ratio-was-used-for-a-particular-jpeg。 - matt wilkie
如果我使用软件打开一个.bmp文件,保持原始质量图像,并将其保存为质量级别为50的jpeg文件。 然后我打开这个jpeg文件,并将其保存到质量级别为60的第二个jpeg文件中。 接着我打开第二个jpeg文件,并将其保存到质量级别为70的第三个jpeg文件中。 现在,如果我使用ImageMagick识别工具来检查第三个jpeg文件的质量,它会告诉我它的质量是“70”还是“21”(0.50.60.7)? - Ben L

27
  1. JPEG是一种有损压缩格式。每次保存JPEG文件都会降低实际图像质量,无论品质级别如何。因此,即使您从文件中获得了一个质量级别,当您再次保存JPEG时(即使品质=100),也无法保持相同的质量。

  2. 您应该以尽可能高的质量水平来保存JPEG文件,而文件大小则取决于可承受的范围。或者使用无损格式,如PNG。

低质量JPEG文件不仅仅会变得更加多块状。相反,色彩深度会降低,并且图像中某些部分的细节也会被删除。您不能指望低质量图像在较小的尺寸下看起来更清晰并且更好。

根据JFIF规范,质量数字(0-100)未存储在图像头中,但水平和垂直像素密度已存储。


6
通常情况下,重新保存 JPEG 格式的图片会导致质量下降,但在某些特定情况下,可以采取措施来避免这种情况。详见 http://en.wikipedia.org/wiki/Jpeg#Lossless_editing。例如,Irfanview 软件提供了一个插件,可以实现无损剪裁/旋转 JPEG 图片。 - j_random_hacker
你知道同样的规则是否适用于 MPEG 视频吗? - johnny
@Johnny,MPEG2(我相信MPEG4也是)也使用有损压缩,因此多次重新编码会降低质量。不确定压缩级别是否存储在MPEG头中。 - Ash
压缩过程中唯一可能发生损失的地方是(潜在的)舍入误差和量化步骤。如果可以完全执行量化并且使用足够精度进行数学计算,则可以保证质量不会降低。主要问题在于标准没有明确定义AFAIK如何执行量化步骤。对于未使用已知编码器编码的文件,我们必须进行某些猜测。当然,在实践中还有其他因素,但对于OP的用例,至少在技术上是可行的。 - Tim Seguine
虽然从技术上讲,每次重新保存JPEG文件都会进一步降低质量,但在第一次保存后,质量损失是最小的。使用80%-90%的JPEG质量保存RAW图像将导致明显的质量损失。但是,如果您多次重新打开和保存文件,则附加的质量损失几乎是不可见的(如果您坚持使用相同的质量设置)。 - Peter
4
这个答案怎么可能是解决方案呢?它完全没有回答问题。 - basZero

15

对于未来访问者,如果要检查给定 jpeg 的质量,您可以使用 imagemagick 工具:

$> identify -format '%Q' filename.jpg
   92%

5
哇,ImageMagick 甚至可以给出 RGB 通道的峰度和偏度以及是否隔行扫描!我经常使用 identity,但从未使用 -verbose 选项。非常有用。 - Clint Pachl
这个答案和DuyLuc的有什么不同? - jtlz2
@jtlz2 如果你仔细检查,就会发现那个答案是在我发帖之后更新的,而且解决方案也类似。 - JAR.JAR.beans
@JAR.JAR.beans 真糟糕!:( - jtlz2
@jtlz2 - 这个答案添加的内容是一个 grep Quality 管道,它提取了 Oran Dennison 评论中提到的 "Quality" 项。(现在两个答案都已经被编辑为使用 -format '%Q'。) - Vectornaut

11

Jpeg压缩算法有一些参数会影响结果图像的质量。

其中一个参数是量化表,用于定义每个系数将使用多少位。不同的程序使用不同的量化表。

有些程序允许用户设置0-100的质量级别。但这个数字没有通用的定义。使用Photoshop制作的60%质量的图像大小为46 KB,而使用GIMP制作的图像大小仅为26 KB。

量化表也是不同的。

还有其他参数,如子采样、DCT方法等等。

因此,您不能通过单个质量级别数字来描述所有这些参数,并且无法通过单个数字比较JPEG图像的质量。但是您可以创建类似于Photoshop或GIMP的数字,以描述在大小和质量之间的折衷。

更多信息: http://patrakov.blogspot.com/2008/12/jpeg-quality-is-meaningless-number.html

常见做法是将图像调整为适当的尺寸,然后应用jpeg压缩。在这种情况下,大型和中型图像将具有相同的大小和质量。


7

已经有两个答案使用了identify,这里提供一个可以同时输出文件名(用于扫描多个文件)的解决方案:

如果您希望在多张图片上使用简单的filename: quality输出,您可以使用以下命令:

identify -format '%f: %Q' *

显示当前目录中所有文件的文件名和压缩情况。请前往此处查看详情。

6

这里是我发现的一种有效的公式:

  1. jpg100size(98-100%质量下不应超过的字节大小)= width * height / 1.7

  2. jpgxsize = jpg100size * x(x = 百分比,例如0.65)

因此,您可以使用这些统计数据来找出上次保存jpg文件时的质量。如果您想将其降至65%的质量并避免重新采样,则应首先比较初始大小以确保它尚未太低,然后再降低质量。


2
很酷的是看到有人也在尝试和我一样的想法。我正在尝试弄清楚在我们的CMS中使用jpeg(或png)图像时“好”的大小是多少。我已经对我们数据库中已有的内容进行了一些统计,并且也进行了一些实验。目前,我将开始警告上传大于4K和32x32像素且Area:Bytes比率<1的JPEG图像的用户。 - elgholm
3
劳尔,你是如何计算出“1.7”系数的? - Hassan Baig
1
更像是试错,但对于一个直线线性公式来说非常接近。 - Raul Popa

3

如果您使用与原始创建JPEG相同的软件和设置重新保存它,您会发现损坏程度被最小化了 - 算法倾向于扔掉第一次扔掉的相同信息。我认为没有办法仅通过查看文件来知道选择了哪个级别; 即使您可以,不同的软件几乎保证具有不同的参数和舍入,使匹配几乎不可能。


3

因此,基本上有两种情况是你需要关注的:

  1. 如果传入图像的质量设置过高,它可能会占用不合适的空间。因此,您可能希望将传入的 q=99 降低到 q=85。

  2. 如果传入图像的质量设置过低,则提高其质量可能会浪费空间。除非一个图像丢弃了大量的数据,否则在提高质量时不会自动占用更多的空间 -- 即使在高质量设置下,块状图像也可以被很好地压缩。因此,在我看来,将传入的 q=1 提高到 q=85 是完全可以接受的。

由此我认为简单地强制设定一个合理的质量设置是完全可以接受的。


3
我知道这是一个相当陈旧的帖子,但您的第二个观点是不正确的。压缩后的图像在重新压缩时往往会占用更多的空间。 - Ben D
@BenD 如果你在压缩之间增加质量,你不会神奇地得到在第一个压缩文件中不存在的频率分量。如果实际上发生了这种情况,那么压缩器并不是非常智能,因为数据事先已经被适当量化。我认为这里的问题是标准允许解码图像存在小差异,这样第二次可能有一个潜在不同的 DCT。通过适当编码的 jpeg 库,理论上和实践上都可以实现第二点。 - Tim Seguine
2
@Tim,我可能误解了你的批评,但我认为你在这一点上是错误的。因为JPEG压缩经常会产生噪点,并且生成的JPEG不存储其当前的压缩级别,次要压缩(即原始->质量=60->质量=80)通常比主要压缩更大。我使用GD和桌面压缩器运行了这个测试(请参见我的原始链接)......因为压缩器无法知道图像的当前压缩状态,所以在运行后续压缩时无法智能化。如果您知道解决此问题的方法,我很想知道。 - Ben D
1
@BenD 这里最大的问题是压缩中的量化步骤。除非您了解所使用的压缩器的详细信息,否则可能无法猜测在量化过程中做出的权衡。此外,由于标准允许在解压缩期间每个块有1位差异(如果我没记错),而且不需要使用完美舍入精度来执行DCT,这意味着您大多是正确的。但这些基本上只是实际问题。如果您将JPEG解压缩并精确到机器epsilon,然后再次执行未经量化的DCT, - Tim Seguine
2
这是一个非常有趣的讨论。我几乎不介意这意味着我的原始答案是错误的。 :) - Eric Seppanen
显示剩余2条评论

2
每次保存文件都会进一步降低总体质量,使用更高的质量值可以保留更多的图像。无论原始图像质量如何。

2

这可能是一个愚蠢的问题,但你为什么要担心微观管理文档的质量?我认为如果你使用ImageMagick进行转换,它会为你管理JPEG的质量以获得最佳效果。http://www.php.net/manual/en/intro.imagick.php


有时候我想确保艺术家实际上提供了未压缩的图像(有几次他们不小心给了我一个压缩的JPEG)。 - David Dunham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接