通常当图像进入我的网站时,我使用我编写的图像库将其保存为jpg,默认质量为80%。现在,当我需要对它进行一些其他操作(比如裁剪它,甚至只是调整它)时,图像将以jpg打开,处理,然后保存回来。但是,如果它在我不想再次压缩之前已被压缩,或者每次我需要进行操作时质量都会下降。
有没有办法可以使用标准GD php库中的工具检测图像之前已经压缩了多少(与我猜的png版本相比)?我知道通过比较压缩的相对数量来检测图像在哪里被Photoshop处理的工具这样做,所以我认为可以检测到压缩量,但有人知道我将如何进行这种计算吗?感谢。
答案 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
似乎是同一工具的移植,所以您可以检查一下。