可以分辨出JPEG的质量等级吗?


77

这实际上是一个两部分的问题,因为我还不完全了解这些事情是如何工作的:

我的情况:我正在编写一个网络应用程序,该程序可让用户上传图片。然后,我的应用将调整为可显示的大小(例如:640x480-ish),并保存文件以备后用。

我的问题:

  1. 给定任意的JPEG文件,是否可以分辨质量等级,以便在保存调整大小的图像时可以使用相同的质量?
  2. 这甚至有关系吗?无论原始质量如何,是否都应将所有图像保存在适当的水平(例如:75-80)?

我对此不太确定,因为据我所知:(让我们举一个极端的例子),如果某人保存了质量为0的5百万像素图像,那么它就会像任何东西一样都是块状的。将图像尺寸减小为640x480,可以消除块状现象,几乎不会引起注意...直到我再次将其保存为质量0 ...

在频谱的另一端,如果有一个图像,它的图像是q == 0的800x600,那么将其尺寸调整为640x480并不会改变看起来像胡扯的事实,因此使用q = 80进行保存将是多余的。

我什至靠近吗?

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


2
nickf您能否接受@DuyLuc的答案,该答案使用标识-format'%Q'?它可以解决问题,与当前接受的答案不同。刚刚尝试了我的文件,它的工作原理。谢谢!
亚历克斯一世

Answers:


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

  2. 您应该以文件大小可以承受的最高质量保存JPEG。或使用无损格式,例如PNG。

低质量的JPEG文件不会简单地变得块状。而是减少了色彩深度,并删除了图像各部分的细节。您不能依靠质量较低的图像块状并且在较小尺寸下看起来还不错。

根据JFIF规范。尽管存储了水平和垂直像素密度,但质量编号(0-100)并未存储在图像标题中。


5
+1,通常来说,保存JPEG会降低质量,这是正确的,但是在某些受限情况下,可以解决此问题-参见en.wikipedia.org/wiki/Jpeg#Lossless_editing。例如,Irfanview有一个用于无损JPEG裁剪/旋转的插件。
j_random_hacker 2010年

您知道mpeg视频是否同样适用吗?
约翰尼2010年

@ johnny,MPEG2(我相信MPEG4)也使用有损压缩,因此多次重新编码会降低质量。但是不确定压缩级别是否存储在MPEG标头中。
灰烬

压缩过程中实际发生损耗的唯一地方是(可能)舍入误差和量化步骤。如果量化可以相同地执行并且数学可以足够精确地完成,则可以保证质量不会降低。主要问题是该标准没有精确定义AFAIK量化步骤的执行方式我们必须对未使用已知编码器编码的文件做出某些猜测。实践中当然还有其他因素,但是对于OP的用例,至少在技术上是可行的。
Tim Seguine 2012年

3
这个答案怎么解决?它根本无法回答问题。
basZero

124

您可以使用identifyImageMagick中的工具查看压缩级别。下载和安装说明可在官方网站上找到。

安装它后,从命令行运行以下命令:

identify -format '%Q' yourimage.jpg

这将返回从0(低质量,小文件大小)到100(高质量,大文件大小)的值。

信息来源


2
您要在输出中寻找的特定项目是Quality:项,它与所有EXIF数据一起出现在Properties:部分的前面。以最高质量这个值将是100
奥兰Dennison公司

4
@OranDennison您的评论含糊不清,足以让我在EXIF数据中寻找“质量”标签。但没有:“质量”是identify -verbose的输出功能。
Skippy le Grand Gourou

5
我不明白为什么这个答案没有被标记为解决方案???它确实没有任何责备。
basZero

12

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

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

4
哇,ImageMagick甚至可以为您提供RGB通道的峰度和偏度,以及是否交错!我identity一直在用,但从来没有-verbose选择。很有用。
克林特·帕奇

8

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

这样的参数之一是量化表,其定义了将在每个系数上使用多少位。不同的程序使用不同的量化表。

某些程序允许用户将质量级别设置为0-100。但是,这个数字并没有统一的定义。用Photoshop制作质量为60%的图像占用46 KB,而用GIMP制作的图像仅占用26 KB。

量化表也不同。

还有其他参数,例如子采样,dct方法等。

因此,您无法通过单个质量级别号来描述所有图像,也无法通过单个数字来比较jpeg图像的质量。但是您可以创建诸如photoshop或gimp之类的数字,以描述质量与尺寸之间的折衷。

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

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


6

由于使用已有两个答案identify,因此,这也是一个输出文件名(一次扫描多个文件)的答案:

如果您希望有一个简单的输出filename: quality用于多个图像,则可以使用

identify -format '%f: %Q' *

显示文件名+压缩在当前目录中的所有文件。


4

这是我发现效果很好的公式:

  1. jpg100size(对于98-100%的质量,其大小不得超过字节)=宽度*高度/1.7

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

因此,您可以使用这些统计信息来统计上次保存jpg的质量。如果您想将其降低到65%的质量,并且想要避免重新采样,则应首先比较尺寸,以确保尺寸不太小,然后再降低质量


很高兴看到其他人一直在和我玩同样的主意。我试图弄清楚,在我们的CMS中使用jpeg(或png)图像时,“好”尺寸是多少。我已经对数据库中已有的数据进行了一些统计,并且还一直在处理一些数字。.从现在开始,我将开始警告用户上传大于4K和32x32像素的JPEG图像,并且面积:字节比率<1。
Elgholm '16

2
劳尔,您如何计算1.7系数?
哈桑·拜格,

更像是反复试验,但是对于直线线性公式来说非常接近
Raul Popa

3

因此,您基本上关心两种情况:

  1. 如果传入图像的画质设置过高,则可能会占用不适当的空间。因此,例如,您可能希望将传入的q = 99减少到q = 85。

  2. 如果传入图像的质量设置过低,则可能浪费空间来提高其质量。提高质量后,除了丢弃大量数据的图像不会神奇地占用更多空间外,即使在高质量设置下,块状图像也可以很好地压缩。因此,我认为将传入的q = 1提高到q = 85是完全可以的。

因此,我认为简单地强制设置一个好的质量设置是一件完全可以接受的事情。


3
我意识到这是一个比较旧的线程,但是您的第二点是不正确的。重新压缩后,压缩后的图像通常会占用更多空间
2012年

@BenD如果增加两次压缩之间的质量,则不会神奇地获得第一个压缩文件中没有的频率分量。如果实际上发生这种情况,那么压缩器就不是很智能,因为数据已经被先验量化了。我认为这里的问题是该标准允许解码图像中的微小差异,从而第二次可能具有不同的DCT。使用适当编码的jpeg库,从理论上和实践上都应该有可能成为第2点。
Tim Seguine 2012年

1
@Tim我可能会误解您的评论,但我认为您在这一点上是错的。由于JPEG压缩通常会导致噪声,并且生成的JPEG不存储其当前压缩级别,因此辅助压缩(即,原始-> Quality = 60-> Quality = 80)通常会大于主压缩。我已经使用GD和桌面压缩程序运行了该测试(请参阅我的原始链接)...由于压缩程序无法知道图像的当前压缩状态,因此在运行后续压缩时无法智能化。如果您知道解决此问题的方法,我很想知道。
本D

1
@BenD这里最大的问题是压缩中的量化步骤。除非您了解有关所使用压缩器的详细信息,否则可能无法猜测量化期间的权衡。同样,由于该标准允许在解压缩过程中每个块IIRC产生1位的差异,并且不需要以完美的舍入精度来完成DCT,这意味着您大体上是正确的。但是,这些仅是实际问题。如果您准确地将jpeg解压缩到机器epsilon,然后再次执行DCT而不进行量化,则
Tim Seguine 2012年

1
这是一个有趣的讨论。我几乎不介意这意味着我的原始答案是错误的。:)
Eric Seppanen 2012年

2

通过使用更高的质量值,文件的每次新保存都会进一步降低整体质量,您将保留更多图像。无论原始图像质量如何。



1

如果使用与最初创建它相同的软件重新保存JPEG,并使用相同的设置,则会发现损害最小化-该算法将倾向于抛出与第一次抛出的相同的信息。我认为无法通过查看文件来了解选择了哪个级别。即使可以,不同的软件几乎可以保证不同的参数和舍入,因此几乎不可能进行匹配。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.