利用php+imagick进行图片优化(二)
微wx笑 2022-03-21【编程语言】 3 0关键字: php imagick
功能描述1. 渐近式加载当前图片的加载方式分为:baseline与interlace两种。baseline是常见的图片加载方式,从上往下扫描图片;interlace(隔行扫描),首先显示图片的大体模糊轮廓,随
功能描述
1. 渐近式加载
当前图片的加载方式分为:baseline与interlace两种。baseline是常见的图片加载方式,从上往下扫描图片;interlace(隔行扫描),首先显示图片的大体模糊轮廓,随着加载的进行图片逐渐变的清晰(这种方式也就是渐近式加载Progressive)。
研究表明,当图片大小>10k时采用interlace的加载方式,用户体验更好,故本系统对大于10k的图片(多帧gif除外)均转化为这种加载方式。
2. 图片压缩
目前本系统只支持对jpg的压缩。如果调用方指定了需求质量(即压缩比),系统将严格按照指定压缩比进行图片压缩;反之,将默认将图片进行80%的质量压缩。
图片压缩可以极大地节约图片存储大小,如一张1.3M的jpg图片,经过压缩(默认80%的压缩比)后其大小变为305.6K;如果将其按60%的压缩比进行压缩,其大小变为237.3.
采用这种方式会不可避免的降低图片质量,具体的压缩比视业务而定,但采用70~80%的压缩比是通常可以接受的范围。
3. 强制格式转换
强制将图片转化成目标格式。
需要明确的几点:
(1)透明gif、png图转化成jpg时,由于jpg不支持透明,其透明部分会变黑
(2)动态gif转化成png或jpg时只能得到第一帧的数据
(3)gif、jpg转png时:gif转化成png8,jpg转成png24.jpg转png时,默认情况下得到的图片相较原图变大,如一张44k的图片经强制格式转化后其大小变为392k……如果想得到png8格式的图片,请指定目标格式为png8,而非png
4. 图片存储大小优化
主要包含以下两种优化方式:
(1)将单帧gif图转成png8(一张80k的单针gif图转化后其大小为68.4K)
(2)非透明png转成png8(一张2.4M的png图片转成png8后其大小为1.1M)
实现示例
1.渐近式加载
原图
代码
1 $im = new Imagick();//初始化一个IM对象
2 $im->readImage("/home/ben/jpg/large/d21.jpg");//将带处理图片读入IM对象
3 $im->setInterlaceScheme(imagick::INTERLACE_PLANE);//设定隔行扫描方式
4 $im->writeImages("/home/ben/progressed.jpg",true);
效果图
2.将图片格式变为png8
1 $im->setImageFormat('PNG8');//改变图片格式
2 $im->setImageDepth(8);//设定图片位深
3 $im->setColorspace(imagick::COLORSPACE_RGB );//设定颜色空间
4 $im->setImageType(imagick::IMGTYPE_PALETTE);//核心------设定图片类型为绘图板(Palette)
PS:
图片类型Palette vs TrueColor
Palette:绘图板,png8或gif。将图像中那些唯一的颜色提取出来建立一个列表,这个列表通常叫做调色板(也可以称为索引)。有了这个颜色列表,就可以通过将调色板中的条目和每个像素重新匹配,达到重新绘制整个图片的目的。调色板可以包含任意RGB颜色值,但是最经常使用的调色板图像格式,GIF和PNG8,限制调色板中最多只能包含256种颜色。这不是说你只可以从256种已经定义好的颜色中选择,恰恰相反,你可以从1600+万的颜色中选择你需要的值,但是最多只可以选择256种包含在图像中。
TrueColor:真彩,png24或png32或jpg,可以支持255*255*255种颜色。
3.判断图片是否透明
透明图分为:png32,支持alpha透明;png8与gif,支持布尔透明
RGBA不是一个不同的颜色模型,是在RGB的基础上做了扩展。额外的组件A代表alpha透明,值的范围也是从0到255,而实际上不同的程序和库会将透明定义为从0%到100%的百分比或者从0到127的值。alpha通道描述了可以从图像的像素中看到多少。 alpha信道相关配置选项:
imagick::ALPHACHANNEL_ACTIVATE (integer)
imagick::ALPHACHANNEL_DEACTIVATE (integer)
imagick::ALPHACHANNEL_RESET (integer)
imagick::ALPHACHANNEL_SET (integer)
imagick::ALPHACHANNEL_UNDEFINED (integer)
imagick::ALPHACHANNEL_COPY (integer)
imagick::ALPHACHANNEL_EXTRACT (integer)
imagick::ALPHACHANNEL_OPAQUE (integer)
imagick::ALPHACHANNEL_SHAPE (integer)
imagick::ALPHACHANNEL_TRANSPARENT (integer)
有研究建议不要将真彩png转化成png8,其原因主要是因为转化过程中透明png的转化效果很不理想。然而,当图片的alpha信道处于Deactivate或Undefined状态时我们可以认为该png图片是不透明的,可以将其转化成png8
$flag = $this->_imagickSvc->getImageAlphaChannel();
if(imagick::ALPHACHANNEL_UNDEFINED == $flag||imagick::ALPHACHANNEL_DEACTIVATE == $flag)
return false;//不透明
else
return true;//透明
4.图片质量压缩
$format = $this->getImageFormat();
if($format == 'jpeg'\|\|$format == 'JPEG')
$this->_imagickSvc->setImageCompression(Imagick::COMPRESSION_JPEG);
if(empty($quality))
{ $quality = $this->_imagickSvc->getImageCompressionQuality() * 0.75;
if ($quality == 0){
$quality = 75;
} }
$this->_imagickSvc->setImageCompressionQuality($quality);
}
5. 去掉EXIF
Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。删去它对JPG图片本身没有任何影响,可以简单的调用stripImage()处理。一张120k的图片经过这种处理后变为108K
转自:http://blog.sina.com.cn/s/blog_6bf82eb20100w5ls.html
本文为转载文章,版权归原作者所有,不代表本站立场和观点。