linux图片处理ImageMagick以及PHP的imagick扩展
linux /
2015年01月18日 15时34分 /
6914人浏览
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) 写的脚本。
常见用例:
影响图片大小(占用空间)主要取决于图片的profile和quality。
- quality:图片的品质,品质越高,占用的空间越大。适当降低品质能很大程度的减少图片的尺寸。一般来说,从品质100降到85,基本上肉眼很难区别其差别,但尺寸上减少很大。imagemagick通过通过-quality 来设置。
- profile:记录图片一些描述信息。例如相机信息(光圈,相机型号)、photoshop元数据,颜色表等信息。它占用的空间可以从几KB到几百KB,甚至可能更大。ImageMagicK可以通过两种方式来去掉这些信息。+profile “*” 或 -strip
Exif信息是数码相机在拍摄过程中采集的一系列信息,这些信息放置在我们熟知的jpg文件的头部,也就是说Exif信息是镶嵌在JPEG图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。简单的说,它就好像是傻瓜相机的日期打印功能一样,只不过Exif信息所记录的资讯更为详尽和完备。不过,具有Exif信息的JPEG图像文件要比普通的JPEG文件略大一点。还有就是像PS这种软件处理过的图片会有“program comments”。如果不是专业的摄影类网站,这些信息是没有用的,可以去掉:
convert +profile “*” -strip src.jpg src-profile.jpg
降低图片的quality品质来压缩图片
convert -quality 85 src.jpg src-quality85.jpg
上面两个命令结合到一起使用:
find /tmp/images -iname "*.jpg" -exec convert -strip +profile "*" -quality 80 {} {} \;
经过这两个命令的处理,你的图片绝对可以缩小很多。PS:根据我的经验,把png图片转换为jps图片会减小很多,然后再用以上两个命令处理一下,那就完美了。
PNG也可以通过减少PNG图片color数量的办法达到压缩的目的。但是这种办法压缩出来的图像可以明显看出来失真,而且呈锯齿状。
对于真实世界的PNG图片(通常指照片),一般先转换成JPG,再通过上面的办法来压缩。
convert -format jpg input.png input.jpg
对用户上传图片进行缩放
对于用户自己上传的图片不能简单的 用css限制大小,因为这样每次加载图片时候还是会加载整幅大图。占用多余的宽带,并且影响页面加载速度。应该根据实际显示需要进行缩放。比如我想要用户相册里的图片大小不能超过500x300:
convert -resize "500x300>" input.jpg output.jpg #如果图片比500x300小就保持原样,以防小图片被放大失真。
下面说一下安装php的imgick扩展,来处理图片:
安装:
1. 下载安装ImageMagick
wget http://www.imagemagick.org/download/legacy/ImageMagick-6.6.8-10.tar.gz
tar -xzvf ImageMagick-6.6.8-10.tar.gz
./configure –prefix=/usr/local/imagemagick
make
make install
2. 下载安装Imagick
注:安装该扩展不要求安装ImageMagick
从http://pecl.php.net/package/imagick找到imagick的最新的版本
wget http://pecl.php.net/get/imagick-3.1.0RC1.tgz
tar -xzvf imagick-3.1.0RC1
phpize
./configure –with-php-config=/usr/local/php/bin/php-config –with-imagick=/usr/local/imagemagick
make
make install
make install执行结果显示:
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
Installing header files: /usr/local/php/include/php/
生成imagick.so到/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/,然后手动配置php.ini使其生效
/*
* 图片压缩类 重新封装了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();
}
}
}