为了提高页面的加载速度,以及减少流量,要针对网站的图片进行瘦身,研究了很多的解决方案,最后确定了使用ImageMagick,了解了这个软件之后,真是如获至宝,简直太好用,效果太明显了。
ImageMagick介绍:
ImageMagick是一套功能强大、稳定而且开源的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF、JPEG、GIF、 PNG、PDF以及PhotoCD等格式。利用ImageMagick,你可以根据 web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。同时ImageMagick提供了一个高质量的2D工具包,部分支持SVG。ImageMagic的主要精力集中在性能,减少bug以及提供稳定的API和ABI上。
ImageMagick 是一个用来创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线, 多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布。支持大多数的操作系统。
ImageMagick的命令概览
[ convert | identify | mogrify | composite | montage | compare | display | animate | import | conjure ]
convert:转换图像格式和大小,模糊,裁剪,驱除污点,抖动,临近,图片上画图片,加入新图片,生成缩略图等。
identify:描述一个或较多图像文件的格式和特性。
mogrify:按规定尺寸***一个图像,模糊,裁剪,抖动等。Mogrify改写最初的图像文件然后写到一个不同的图像文件。
composite:根据一个图片或多个图片组合生成图片。
montage:创建一些分开的要素图像。在含有要素图像任意的装饰图片,如边框、结构、图片名称等。
compare:在算术上和视觉上评估不同的图片***其它的改造图片。
display:如果你拥有一个X server的系统,它可以按次序的显示图片
animate:利用X server显示动画图片
import:在X server或任何可见的窗口上输出图片文件。 你可以捕获单一窗口,整个的荧屏或任何荧屏的矩形部分。
conjure:解释执行 MSL (Magick Scripting Language) 写的脚本。
安装:
sudo apt-get install imagemagick
影响图片大小(占用空间)主要取决于图片的profile和quality。
convert +profile “*” -strip src.jpg src-profile.jpg
convert -quality 85 src.jpg src-quality85.jpg
find /tmp/images -iname "*.jpg" -exec convert -strip +profile "*" -quality 80 {} {} \;
PNG也可以通过减少PNG图片color数量的办法达到压缩的目的。但是这种办法压缩出来的图像可以明显看出来失真,而且呈锯齿状。
对于真实世界的PNG图片(通常指照片),一般先转换成JPG,再通过上面的办法来压缩。
convert -format jpg input.png input.jpg
convert -resize "500x300>" input.jpg output.jpg #如果图片比500x300小就保持原样,以防小图片被放大失真。
安装:
1.安装imgick扩展
1) sudo apt-get install libmagick-dev2) sudo apt-get install php-pear php5-dev3) sudo pecl install imagick
打开php.ini文件,在其中加入extension=imagick.so
/etc/php5/apache2/php.ini
/etc/init.d/apache2 restart
$thumb = new Imagick();$thumb->readImage('test.gif');$thumb->writeImage('test.jpg');$thumb->clear();$thumb->destroy();
Imgick Class API:http://php.net/manual/en/class.imagick.php
图片压缩心得:http://blog.lizhigang.net/archives/228
ImageMagick官网:http://www.imagemagick.org/script/index.php
http://elf8848.iteye.com/blog/382528
使用实例:http://hi.baidu.com/7soon/item/d394c2b55bd3bb70254b09ed
最后,附上我自己编写的PHP用Imgick处理图片的类:
/* * 图片压缩类 重新封装了Imagick * * @version 2014-07-30 * @author andy1219111@163.com */class Imgick_tool{ //Imagick对象实例 public $obj = null; public function __construct() { //判断是否加载了该扩展 if(!extension_loaded('Imagick')) { return false; } $this->obj = new Imagick(); } /* * png2jpg转换图片格式 * * @param string src_img 源图片路径 * @param string dest_img 要生成的图片的路径 * @return boolean 转换成共返回true 否则false */ public function png2jpg($src_img,$dest_img) { if(!is_object($this->obj)) { return false; } try { $this->obj->readImage($src_img); if($this->obj->writeImage($dest_img)) { $this->destory(); return $dest_img; } return false; } catch (ImagickException $e) { return false; } } /* * 去掉图片的profile信息 * * @param string src_img 源图片路径 * @return string src_img 图片名称 否则返回false */ public function strip_profile($src_img,$dest_img = '') { if(!is_object($this->obj)) { return false; } try { $dest_img = empty($dest_img) ? $src_img : $dest_img; $this->obj->readImage($src_img); $this->obj->stripImage (); if($this->obj->writeImage ($dest_img)) { $this->destory(); return $src_img; } return false; } catch (ImagickException $e) { return false; } } /* * 设置jpg图片质量 * * @param string src_img 源图片路径 * @param string dest_img 要生成的图片的路径 * @return boolean 转换成共返回true 否则false */ public function set_quality($src_img,$quality = 70,$dest_img = '') { if(!is_object($this->obj)) { return false; } try { $dest_img = empty($dest_img) ? $src_img : $dest_img; $this->obj->readImage($src_img); $this->obj->setImageCompression(Imagick::COMPRESSION_JPEG); $this->obj->setImageCompressionQuality($quality); if($this->obj->writeImage($dest_img)) { $this->destory(); return $dest_img; } return false; } catch (ImagickException $e) { return false; } } /* * 图片瘦身 * * @param string src_img 源图片路径 * @param int quality 设置图片压缩质量 * @param string dest_img 要生成的图片的路径 * @return boolean 转换成共返回true 否则false */ public function slimming($src_img,$quality = 60,$dest_img = '',) { if(!is_object($this->obj)) { return false; } try { $dest_img = empty($dest_img) ? $src_img : $dest_img; $this->obj->readImage($src_img); $this->obj->setImageFormat('jpeg'); $this->obj->setImageCompression(Imagick::COMPRESSION_JPEG); //将图片的质量降低到原来的60% $quality = $this->obj->getImageCompressionQuality() * $quality / 100; $this->obj->setImageCompressionQuality($quality); $this->obj->stripImage(); if($this->obj->writeImage($dest_img)) { $this->destory(); return $dest_img; } return false; } catch (ImagickException $e) { return false; } } /* * 生成缩略图 * * @param string src_img 源图片路径 * @param int quality 设置图片压缩质量 * @param string dest_img 要生成的图片的路径 * @return boolean 转换成共返回true 否则false */ public function thump($src_img,$width = 250,$height = '') { if(!is_object($this->obj)) { return false; } try { $file_info = pathinfo($src_img); //生成缩略图名称 $file_name = substr($file_info['basename'],0,strrpos($file_info['basename'],'.')); $dest_img = $file_info['dirname'] . '/' . $file_name . '_thump.' . $file_info['extension']; $this->obj->readImage($src_img); //计算要获得缩略图的高度 $img_width = $this->obj->>getImageWidth(); $img_height = $this->obj->>getImageHeight(); $dest_height = $img_height * ($width / $img_width); $this->obj->resizeImage($width, $dest_height, Imagick::FILTER_CATROM, 1, false); //生成图片 if($this->obj->writeImage($dest_img)) { $this->destory(); return $dest_img; } return false; } catch (ImagickException $e) { return false; } } /* * 释放资源 * */ function destory() { if(is_object($this->obj)) { $this->obj->clear(); $this->obj->destroy(); } } }