83

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

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

我的问题:

  1. 给定一个任意 JPEG 文件,是否可以判断质量级别是什么,以便在保存调整大小的图像时可以使用相同的质量?
  2. 这还重要吗??无论原始质量如何,我是否应该将所有图像保存在一个不错的水平(例如:75-80)?

我对此不太确定,因为正如我所想的那样:(让我们举一个极端的例子),如果有人以质量 0 保存了 5 兆像素的图像,它会像任何东西一样块状。将图像尺寸减小到 640x480,块状将被平滑并且几乎不那么明显......直到我再次以质量 0 保存它......

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

我什至接近吗?

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

4

12 回答 12

134

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

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

identify -format '%Q' yourimage.jpg

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

信息来源

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

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

低质量的 JPEG 文件不会变得更加块状。取而代之的是减少了颜色深度,并删除了图像部分的细节。您不能依赖较低质量的图像块状并且在较小尺寸下看起来还可以。

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

于 2010-01-08T01:57:44.297 回答
14

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

$> identify -format '%Q' filename.jpg
   92%
于 2015-04-02T17:35:30.920 回答
10

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。在这种情况下,大图像和中图像将具有相同的大小和质量。

于 2010-01-11T17:38:53.373 回答
6

由于使用 已经有两个答案identify,这里还有一个也输出文件名的答案(用于一次扫描多个文件)

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

identify -format '%f: %Q' *

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

于 2017-05-09T09:20:21.843 回答
5

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

  1. jpg100size(对于 98-100% 质量,它不应超过的大小(以字节为单位)= width*height/1.7

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

因此,您可以使用这些来统计您的 jpg 最后保存的质量。如果你想把它降低到 65% 的质量,如果你想避免重新采样,你应该先比较大小以确保它不是太低,然后才降低质量

于 2014-10-22T14:13:27.470 回答
3

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

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

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

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

于 2010-01-11T18:39:50.927 回答
2

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

于 2010-01-08T01:56:29.417 回答
2

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

于 2010-01-08T02:09:56.893 回答
2

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

于 2010-01-11T18:32:07.640 回答
2

这里有一些方法可以实现您的 (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。

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

于 2021-03-25T13:39:35.663 回答
0

如果您信任 Irfanview 估计的 JPEG 压缩级别,您可以从由以下 Windows 行命令创建的信息文本文件中提取该信息(您的路径i_view32.exe可能不同):

"C:\Program Files (x86)\IrfanView\i_view32.exe" <image-file> /info=txtfile
于 2022-02-13T09:50:27.950 回答