是否有可能告诉JPEG的质量水平?

时间:2010-01-08 01:50:48

标签: image-processing jpeg image-compression

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

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

我的问题:

  1. 鉴于任意JPEG文件,是否可以判断质量等级是什么,以便在保存已调整大小的图像时可以使用相同的质量?
  2. 这是否重要?我是否应该将所有图像保存在合适的级别(例如:75-80),而不管原始质量如何?
  3. 我对此并不十分肯定,因为我认为:(让我们举一个极端的例子),如果有人在质量0下保存了500万像素的图像,那就像任何东西一样块状。将图像尺寸缩小到640x480,平滑度会变得平滑,几乎不那么明显......直到我再次保存质量为0 ......

    在频谱的另一端,如果有一个图像是800x600,q = 0,调整到640x480不会改变它看起来像完全废话的事实,所以q = 80保存将是多余的。

    我甚至关闭了吗?

    如果有任何用途,我在PHP上使用GD2库

11 个答案:

答案 0 :(得分:90)

您可以通过ImageMagick查看压缩级别。可以在official website找到下载和安装说明。

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

identify -format '%Q' yourimage.jpg

你应该得到从0(低质量,小文件大小)到100(高质量,大文件大小)的值。

<强> Information source

答案 1 :(得分:25)

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

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

  3. 低质量的JPEG文件不会变得更加块状。而是减少颜色深度并移除图像部分的细节。您不能依赖较低质量的图像,并且在较小的尺寸下看起来不错。

    根据JFIF spec.质量数(0-100)未存储在图像标题中,尽管存储了水平和垂直像素密度。

答案 2 :(得分:10)

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

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

答案 3 :(得分:8)

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

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

某些程序允许用户设置质量等级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。在这种情况下,大图像和中图像将具有相同的尺寸和质量。

答案 4 :(得分:4)

由于使用identify已有两个答案,此处还会输出文件名(用于一次扫描多个文件)

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

identify -format '%f: %Q' *

到当前目录中所有文件的show the filename + compression

答案 5 :(得分:3)

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

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

  2. 如果传入的图像质量设置太低,可能会浪费空间来提高质量。除了丢弃大量数据的图像在质量提升时不会神奇地占用更多空间 - 即使在高质量设置下,块状图像也会非常好地压缩。所以,在我看来,将q = 1提高到q = 85是完全可以的。

  3. 从这个角度来看,我认为仅仅强制一个体面的质量设置是完全可以接受的。

答案 6 :(得分:3)

这是我发现运作良好的公式:

  1. jpg100size(98-100%质量不应超过字节数)=宽*高/ 1.7

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

  3. 所以,您可以使用它们来统计找出上次保存jpg的质量。如果你想让它降低,让我们说65%的质量,如果你想避免重新取样,你应该首先比较尺寸,以确保它不是太低,只有降低质量

答案 7 :(得分:2)

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

答案 8 :(得分:1)

如果使用最初创建它的相同软件重新保存JPEG,使用相同的设置,您会发现损坏被最小化 - 算法将倾向于丢弃它第一次丢弃的相同信息。我认为只要通过查看文件就可以知道选择了什么级别;即使你可以,不同的软件几乎可以保证不同的参数和舍入,使匹配几乎不可能。

答案 9 :(得分:1)

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

答案 10 :(得分:0)

这里有一些方法可以实现您的 (1) 并使其正确。

  1. 有一些方法可以通过拟合量化表来做到这一点。 Sherloq - 例如 - 这样做:

    https://github.com/GuidoBartoli/sherloq

    相关(python)代码位于 https://github.com/GuidoBartoli/sherloq/blob/master/gui/quality.py

  2. https://arxiv.org/abs/1802.00992 中还编写了另一种算法 - 您可以考虑联系作者获取任何代码等。

  3. 您还可以模拟 file_size(image_dimensions,quality_level),然后反转该函数/查找表以获得 quality_level(image_dimensions,file_size)。嘿,快点!

  4. 最后,您可以通过计算原始图像和以不同质量级别保存的重新压缩版本之间的差异来采用蛮力 https://en.wikipedia.org/wiki/Error_level_analysis 方法。原件的质量水平大致是差异最小的质量水平。似乎工作得相当好(但在 for 循环中是线性的......)。

通常使用的质量因子似乎是 75 或 95,这可能有助于您更快地获得结果。可能没有人会将 JPEG 保存为 100。可能也没有人会将其保存为 < 60。

我可以在它们可用时为此添加其他链接 - 请将它们放在评论中。