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
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); ?>