jci*_*sio 4 php jpeg imagemagick
我允许用户上传图片.但是,我想保持JPEG质量不超过90%.我打算做的是检测当前的质量: - 如果少于90%什么都不做 - 如果超过90%,比使用Image Magick将图像重新压缩到90%
有可能吗?我更喜欢PHP,但任何语言都会有所帮助.
paddy是正确的,此设置并不总是存储在JPEG文件中.如果是,那么您可以使用identify
Imagemagick来读取质量.例如:
$ identify -format '%Q' tornado_ok.jpg
Run Code Online (Sandbox Code Playgroud)
93%
更新:基于这个问题的答案 https://superuser.com/questions/62730/how-to-find-the-jpg-quality我发现显然
identify
命令仍然可以通过逆向工程量化表来确定质量即使所有图像EXIF /其他元数据都丢失了.顺便说一句,现在问题的标题可能与我链接的问题重复.但对我来说,你的问题本身是有价值的,因为在你的问题文本中你解释了你想要做什么,这不仅仅是检测jpeg的质量.不过,如果你想反映出你试图解决一个更具体的问题而不仅仅是阅读JPEG图像质量,你应该更新标题.
除非您存档原始图像,否则对于Web使用,即使90%也是过量的.75%曾经是过去的默认设置(只有在并排图像之间仔细检查才能看到降级),现在在高带宽的时代,85%是一个非常高质量的选择.90%和85%之间的5%质量差异实际上是不可见的,但通常会节省超过30%的文件大小.JPEG算法的设计首先是消除人类感知在其第一个压缩阶段(超过80%左右)不可见的信息.
更新/注意:我所说的压缩质量设置来自libjpeg的测试,libjpeg是一个非常广泛使用的JPEG库.Photoshop的压缩百分比和其他软件的质量设置都是独立的,并不一定意味着与libjpeg的设置相同.
paddy使用图像高度和图像宽度来计算可接受文件大小的想法是合理的:
您可以像这样获得图像高度/宽度:
list($originalWidth, $originalHeight) = getimagesize($imageFile);
Run Code Online (Sandbox Code Playgroud)
我自己在网上发布的高质量照片,如下所示:http://ksathletics.com/2013/wsumbb/nw.jpg 通常以每百万像素约200 KB的比例保存.
因此,例如,您可以将宽度乘以高度乘以1000000以计算图像中的百万像素.将文件大小除以1024以计算KB.然后将得到的KB除以百万像素.如果结果低于200或您决定的任何值,则无需重新压缩它.否则,您可以使用85%的质量或您决定的任何质量重新压缩它.
小智 6
由于OP表示他更喜欢php,我提供以下内容:
$img = new Imagick($filename);
$quality = $img->getImageCompressionQuality();
Run Code Online (Sandbox Code Playgroud)
小智 5
这是怎么回事?我正在开发的应用程序面临同样的问题...我的问题是,我从一个随机网站提取了几个图像,每个项目有几个图像,我想为每个项目显示一个图像,并带来为用户提供最优质的图像.
我提出了这个想法,非常简单,适用于任何语言和任何类型的压缩:
//Parameters you will need to retrieve from image
$width = 0;
$height = 0;
$filesize = 0;
//Quality answer for your image
$quality = (101-(($width*$height)*3)/$filesize);
Run Code Online (Sandbox Code Playgroud)
我针对上面提到的http://fotoforensics.com/tutorial-estq.php运行了这个算法,结果如下:
Filename Width Height Pixels BitmapBytes FileBytes Quality
estq-baseline.png 400 300 120000 360000 163250 98,79
estq-90.jpg 400 300 120000 360000 34839 90,67
estq-80.jpg 400 300 120000 360000 24460 86,28
estq-70.jpg 400 300 120000 360000 19882 82,89
estq-25.jpg 400 300 120000 360000 10300 66,05
Run Code Online (Sandbox Code Playgroud)
该算法背后的基本思想是比较图像以位图方式(没有任何压缩,每像素3个字节,RGB为3个字节)写入的大小,达到该图像当前使用的大小.图像尺寸越小,压缩越高,与所使用的压缩方法无关,而是JPG,PNG等等,这将导致我们在未压缩和压缩图像之间产生更大的间隙或更小的间隙.
同样重要的是,这是一个用于比较目的的数学解决方案,这种方法不会返回图像的实际质量,它将回答未压缩和压缩尺寸之间的距离百分比!
如果您需要更多详细信息,可以给我发电子邮件:rafaelkarst@gmail.com