centos安装php扩展imagick-高性能处理图片

PHP建图通常都用GD库,因为是内置的不需要在服务器上额外安装插件,所以用起来比较省心,但是如果你的程序主要的功能就是处理图像,那么就不建议用GD了,因为GD不但低效能而且能力也比较弱,占用的系统资源也颇多,另外GD的creatfrom也有bug,而imagick却是一个很好的替代品,为此最近把我的一个项目由GD改成了imagick


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



1、安装ImageMagick
#wget http://soft.vpser.net/web/imagemagick/ImageMagick-6.7.1-2.tar.gz
#tar zxvf ImageMagick-6.7.1-2.tar.gz
#cd ImageMagick-6.7.1-2/
#./configure --prefix=/usr/local/imagemagick --disable-openmp
#make && make install
#ldconfig


2、测试ImageMagick是否可以正常运行
#/usr/local/imagemagick/bin/convert -version
Version: ImageMagick 6.7.1-2 2016-06-29 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features:




二、安装PHP扩展:imagick


1、安装PHP扩展:imagick
#wget http://pecl.php.net/get/imagick-3.0.1.tgz
#tar zxvf imagick-3.0.1.tgz
#cd imagick-3.0.1/
#/usr/local/php/bin/phpize
#./configure --with-php-config=/usr/local/php/bin/php-config --with-imagick=/usr/local/imagemagick
#make && make install
#ldconfig


2、php加载imagick扩展
#vi /etc/php.ini
extension_dir = "/usr/lib64/php/modules"
extension="imagick.so"
#:wq! #保存退出


3、重新加载php-fpm
#service php-fpm reload
如果是apache 则 #service httpd restart


4、测试,查看phpinfo信息,如下图所示:


centos安装php扩展imagick-高性能处理图片_第1张图片


5、php代码测试


<?php
/*
 * 图片压缩类  重新封装了Imagick
 * 
 * @version 2014-07-30
 * @author [email protected]
 */
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();
		}
	}
	
}
 
function resize($image, $width, $height, $crop) {
	$imagick = new Imagick();
	$imagick->readImageBlob($image);
	$w = $imagick->getImageWidth();
	$h = $imagick->getImageHeight();
	if ($w > $width || $h > $height) {
		if ($crop) {
			$imagick->cropThumbnailImage($width, $height);
		} else {
			$imagick->resizeImage($width, $height, Imagick::FILTER_CATROM, 1, true);
		}
	}
	$imagick->setImageFormat('JPEG');
	$imagick->setImageCompression(Imagick::COMPRESSION_JPEG);
	$a = $imagick->getImageCompressionQuality() * 0.75;
	if ($a == 0) {
		$a = 75;
	}
	$imagick->setImageCompressionQuality($a);
	$imagick->stripImage();
	$blob = $imagick->getImageBlob();
	$imagick->clear();
	$imagick->destroy();
	return $blob;
}

/*
$saveDir   保存地址
$file      png图片地址

*/
function imageToJpg($saveDir,$file){
	$saveDir = str_replace ( "\\", "/", $saveDir );
	$srcFile=$saveDir.$file;
	$srcFileExt= strtolower ( trim ( substr ( strrchr ( $srcFile, '.' ), 1 ) ) );
	if($srcFileExt=='jpeg'||$srcFileExt=='jpg'){
		return $saveDir.$file;
	}
	$srcFileName = basename ( $file ,'.'.$srcFileExt);
	$dstFile = $saveDir.$srcFileName.".jpg";
	$photoSize   = GetImageSize($srcFile);
	$pw  = $photoSize[0];
	$ph  = $photoSize[1];
	$srcImage = true;
	if ( stripos( strtolower($srcFile),".gif") ){
		//创建图片
		$dstImage = ImageCreateTrueColor( $pw, $ph);
		imagecolorallocate($dstImage, 255, 255, 255);
		//读取图片
		$srcImage  = ImageCreateFromGif($srcFile);
		//合拼图片
		imagecopyresampled($dstImage,$srcImage ,0,0,0,0,$pw,$ph ,$pw,$ph);
		//ImageCopyResized($dstImage,$srcImage,0,0,0,0,$pw,$ph,$pw,$ph);
		ImageJpeg($dstImage,$dstFile);
		imagedestroy($srcImage );
	}
	if (  stripos( strtolower($srcFile),".png") ){
		//创建图片
		$dstImage = ImageCreateTrueColor( $pw, $ph);
		imagecolorallocate($dstImage, 255, 255, 255);
		//读取图片
		$srcImage  = ImageCreateFromPNG($srcFile);
		//合拼图片
		imagecopyresampled($dstImage,$srcImage ,0,0,0,0,$pw,$ph ,$pw,$ph);
		ImageJpeg($dstImage,$dstFile);
		imagedestroy($srcImage );
	}
	/*if ( $srcImage == false  ||  stripos( strtolower($srcFile),".jpg") ){
	 $srcImage = ImageCreateFromJPEG($srcFile);
	}*/
	if(is_file($srcFile)){
		@unlink($srcFile);
	}
	return $saveDir.$srcFileName.".jpg";
}

imageToJpg('/var/www/html/test/imagick/','e.jpg');

//缩略图片并压缩大小
$image = new Imagick('3.jpg'); 
$image->resizeImage(200,100,Imagick::FILTER_LANCZOS,1);
//$image->cropImage($width_2, $height_2, $x, $y);
$image->setCompression(Imagick::COMPRESSION_JPEG);
$image->setImageCompressionQuality(82);
$image->writeImage('32.jpg');
$image->destroy();
 
$thumb = new Imagick();  
$thumb->readImage('3.jpg');  
$thumb->writeImage('test.jpg');  
$thumb->clear();  
$thumb->destroy(); 

$imagick=new Imgick_tool();
$imagick->png2jpg('fangao.png','fangao.jpg');


//$a=resize('3.jpg',200,100,0);

?>

参考:http://blog.csdn.net/andy1219111/article/details/38335987

你可能感兴趣的:(GD,ImageMagick,php图片处理)