检测JPG压缩率?

时间:2012-02-17 21:55:56

标签: image compression jpeg gd

通常当图像进入我的网站时,我使用我编写的图像库将其保存为jpg,默认质量为80%。现在,当我需要对它进行一些其他操作(比如裁剪它,甚至只是调整它)时,图像将以jpg打开,处理,然后保存回来。但是,如果它在我不想再次压缩之前已被压缩,或者每次我需要进行操作时质量都会下降。

有没有办法可以使用标准GD php库中的工具检测图像之前已经压缩了多少(与我猜的png版本相比)?我知道通过比较压缩的相对数量来检测图像在哪里被Photoshop处理的工具这样做,所以我认为可以检测到压缩量,但有人知道我将如何进行这种计算吗?感谢。

4 个答案:

答案 0 :(得分:8)

您无法从JPG获得质量价值。此外,质量值取决于编码器。它不是标准或类似的东西。有些程序只有(低,中,高),大约20个可能比90好。

其次,即使您每次都将其保存为最佳质量,JPG也会在每个连续编码中失去质量。悲惨的生活真相:)唯一不会降低质量的操作是翻转和旋转(如果它们与JPEG块大小对齐,则为庄稼)。

经验法则:每次以相同的质量值对进行编码。示例:如果您将它保存为60,那么如果您将其保存在80,则无法获得。文件大小更大。

此外,如果您有足够的存储空间,请尝试减少此类重新编码的数量并对原始文件执行每次操作。

答案 1 :(得分:1)

您必须将图像的质量存储在数据库中,以便了解它是否已被压缩。

答案 2 :(得分:1)

为避免多次压缩图像,您只需将调整大小的文件大小与原始文件进行比较即可。

  • 如果文件大小明显增大,那么您已经提高了费率,因此请勿使用它。
  • 如果它明显低于压缩,请使用它。

此外,由于使用相同的费率重新压缩文件只会减少文件大小的数量,如果您使用费率的圆数(60%,70%,80%等),您可以确定费率调整大小的文件大小与原始文件非常相似。

例如,在以下位置压缩1,844 KB文件:
- 90% = 2,115 KB。尺寸增加了,所以我不会使用它。
- 80% = 1,843 KB。这与原始文件大小几乎相同,因此我可以假设原始文件的费率为80%。 - 70% = 1,567 KB。这已经压缩了,所以我会使用它。

最后,如果您只关心自己压缩的图片的比率,那么您可以使用PHP来保存您在文件元数据中使用的比率。

答案 3 :(得分:0)

如果仅对JPG图像进行了一次编码,您实际上可以 在一定程度上确定JPG图像被压缩的质量。

您可以使用名为identify的命令行工具来完成此操作,该工具是Imagemagick的一部分(也可以作为PHP库提供,请参见下文)。您可以运行,例如:

identify -verbose 11397254.jpg

,您将得到如下输出:

Image: 11397254.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Mime type: image/jpeg
  Class: DirectClass
  Geometry: 600x833+0+0
  Units: Undefined
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Pixels: 499800
    Red:
      min: 7 (0.027451)
      max: 251 (0.984314)
      mean: 205.535 (0.80602)
      standard deviation: 40.8098 (0.160038)
      kurtosis: 7.3041
      skewness: -2.81763
      entropy: 0.627683
    Green:
      min: 4 (0.0156863)
      max: 237 (0.929412)
      mean: 200.186 (0.785044)
      standard deviation: 45.9241 (0.180095)
      kurtosis: 3.86968
      skewness: -2.25667
      entropy: 0.6339
    Blue:
      min: 0 (0)
      max: 241 (0.945098)
      mean: 191.701 (0.75177)
      standard deviation: 54.6716 (0.214399)
      kurtosis: 1.22795
      skewness: -1.70134
      entropy: 0.664107
  Image statistics:
    Overall:
      min: 0 (0)
      max: 251 (0.984314)
      mean: 199.141 (0.780945)
      standard deviation: 47.4814 (0.186202)
      kurtosis: 3.61004
      skewness: -2.23079
      entropy: 0.641896
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: JPEG
  Intensity: Undefined
  Compose: Over
  Page geometry: 600x833+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: JPEG
  Quality: 100
  Orientation: Undefined
  Properties:
    date:create: 2020-10-28T09:13:49+01:00
    date:modify: 2020-10-28T09:13:45+01:00
    jpeg:colorspace: 2
    jpeg:sampling-factor: 2x2,1x1,1x1
    signature: 7b5dc010915e4ae8b89891f7259a6f22efc69a31e5244403db580b70adc2ee94
  Artifacts:
    filename: 11397254.jpg
    verbose: true
  Tainted: False
  Filesize: 147KB
  Number pixels: 500K
  Pixels per second: 49.98MB
  User time: 0.010u
  Elapsed time: 0:01.010
  Version: ImageMagick 6.9.7-4 Q16 x86_64 20170114 http://www.imagemagick.org

其中重要的行是:

  Compression: JPEG
  Quality: 100

如果质量为100,则表示图像完全没有被压缩。

我对该工具进行了GIMP JPG压缩测试,结果非常准确,可以检测出我在图像上使用的压缩百分比。

在PHP中,ImageMagick库中有一个函数:

https://www.php.net/manual/en/imagick.identifyimage.php

似乎是同一工具的移植,所以您可以检查一下。