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信息,如下图所示:
5、php代码测试
<?php
/*
* 图片压缩类 重新封装了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();
}
}
}
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