一般用php处理图片都是使用GD库或者GD2的函数库,一般编译php环境都会搭上GD库,大多数开源程序也是用GD来处理图片的,但是它只能现实诸如调整大小、增加水印等基础功能,要想用GD来做复杂图形是非常困难的。

还好有个基于命令行的图像处理软件ImageMagick,能实现非常丰富的功能。如果服务 器上安装了ImageMagick,php脚本可以使用shell命令来完成,也可以用php的原生函数库Imagick或者 MagickWandForPHP函数来调用ImageMagick软件来实现。

因为Linux系统下PHP往往没有执行shell的权限,直接用shell来操作ImageMagick不太可能,综合考虑,Imagick函数库连接到ImageMagick软件比较好,而且是面向对象方式的。

Linux系统下,编译安装ImageMagick软件

wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick-6.5.2-7.tar.gz
tar -zxvf ImageMagick-6.5.2-7.tar.gz
cd ImageMagick-6.5.2-7/
./configure
make
make install
#译PHP原生库Imagick
wget http://pecl.php.net/get/imagick-2.2.2.tgz
tar zxvf imagick-2.2.2.tgz
cd imagick-2.2.2/
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config
make
make install
#最后,修改php.ini,加上(去除下面#号)
#extension = "imagick.so"

查看phpinfo,如果有Imagick,则说明安装成功。

详细安装可参考 Nginx 0.7.x + PHP 5.2.9(FastCGI)搭建胜过Apache十倍的Web服务器(第5版)http://blog.s135.com/nginx_php_v5/

Imagick函数库资料太少,能参考的就是PHP官方手册http://cn2.php.net/imagick,但是无详细示例介绍。下面简单写了个实例,找了手册很长时间才做出来的,希望对大家有帮助。

原图http://test.studenthome.cn/imagick/b.jpg

按要求缩小图片尺寸、增加半透明边框,读入exif信息,按指定要求显示在图片上。

php生成的图片http://test.studenthome.cn/imagick/imagick4.php

 $towidth = '500';$toheight = '700'; //设置图片调整大小时允许的最大宽度和高度$sourcefile = './b.jpg'; //定义一个图像文件路径//$image->writeImage('./b.jpg.bak'); //可以备份这个图片$myimage = new Imagick( $sourcefile ); //读入该图像文件$exifobject = my_exif( $myimage ); //自写函数,读取exif信息(拍摄数据),按自己的要求排列exif信息,返回对象//$myimage->setImageFormat('jpeg'); //把图片转为jpg格式$myimage->setCompressionQuality( 100 ); //设置jpg压缩质量,1 - 100$myimage->enhanceImage(); //去噪点$sourcewidth = $myimage->getImageWidth(); //获取读入图像原始大小if ( $sourcewidth > $towidth ){$myimage->scaleImage( $towidth, $toheight, true ); //调整图片大小}$myimage->raiseImage( 8, 8, 0, 0, 1 ); //加半透明边框$resizewidth = $myimage->getImageWidth(); //读出调整之后的图片大小$resizeheight = $myimage->getImageHeight();$drawback = new ImagickDraw(); //实例化一个绘画对象,绘制半透明黑色背景给exif信息用$drawback->setFillColor( new ImagickPixel('#000000') ); //设置填充颜色为黑色$drawback->setFillOpacity( 0.6 ); //填充透明度为0.6,参数0.1-1,1为不透明$drawback->rectangle( $resizewidth / 2 - 190, $resizeheight - 50, $resizewidth / 2 + 190, $resizeheight - 12 ); //绘制矩形参数,分别为左上角x、y,右下角x、y$myimage->drawImage( $drawback ); //确认到image中绘制该矩形框$draw = new ImagickDraw(); //实例化一个绘画对象,绘制exif文本信息嵌入图片中$draw->setFont( './xianhei.ttf' ); //设置文本字体,要求ttf或者ttc字体,可以绝对或者相对路径$draw->setFontSize( 11 ); //设置字号$draw->setTextAlignment( 2 ); //文字对齐方式,2为居中$draw->setFillColor( '#FFFFFF' ); //文字填充颜色$myimage->annotateImage( $draw, $resizewidth / 2, $resizeheight - 39, 0, $exifobject->row1 ); //绘制第一行文本,居中$myimage->annotateImage( $draw, $resizewidth / 2, $resizeheight - 27, 0, $exifobject->row2 ); //绘制第二行文本,居中$myimage->annotateImage( $draw, $resizewidth / 2, $resizeheight - 15, 0, $exifobject->row3 ); //绘制第三行文本,居中header( 'Content-type: image/jpeg' ); //php文件输出mime类型为jpeg图片echo $myimage; //在当前php页面输出图片//$image->writeImage('./b.new.jpg'); //如果图片不需要在当前php程序中输出,使用写入图片到磁盘函数,上面的设置header也可以去除$myimage->clear();$myimage->destroy(); //释放资源//自写函数,读取exif信息,返回对象function my_exif( $myimage ){$exifArray = array( 'exif:Model' => '未知', 'exif:DateTimeOriginal' => '未知', 'exif:ExposureProgram' => '未知', 'exif:FNumber' => '0/10', 'exif:ExposureTime' => '0/10', 'exif:ISOSpeedRatings' => '未知','exif:MeteringMode' => '未知', 'exif:Flash' => '关闭闪光灯', 'exif:FocalLength' => '未知', 'exif:ExifImageWidth' => '未知', 'exif:ExifImageLength' => '未知' ); //初始化部分信息,防止无法读取照片exif信息时运算发生错误$exifArray = $myimage->getImageProperties( "exif:*" ); //读取图片的exif信息,存入$exifArray数组//如果需要显示原数组可以使用print_r($exifArray);$r->row1 = '相机:' . $exifArray['exif:Model'];$r->row1 = $r->row1 . ' 拍摄时间:' . $exifArray['exif:DateTimeOriginal'];switch ( $exifArray['exif:ExposureProgram'] ){case 1:$exifArray['exif:ExposureProgram'] = "手动(M)";break; //Manual Controlcase 2:$exifArray['exif:ExposureProgram'] = "程序自动(P)";break; //Program Normalcase 3:$exifArray['exif:ExposureProgram'] = "光圈优先(A,Av)";break; //Aperture Prioritycase 4:$exifArray['exif:ExposureProgram'] = "快门优先(S,Tv)";break; //Shutter Prioritycase 5:$exifArray['exif:ExposureProgram'] = "慢速快门";break; //Program Creative (Slow Program)case 6:$exifArray['exif:ExposureProgram'] = "运动模式";break; //Program Action(High-Speed Program)case 7:$exifArray['exif:ExposureProgram'] = "人像";break; //Portraitcase 8:$exifArray['exif:ExposureProgram'] = "风景";break; //Landscapedefault:$exifArray['exif:ExposureProgram'] = "其它";}$r->row1 = $r->row1 . ' 模式:' . $exifArray['exif:ExposureProgram'];$exifArray['exif:FNumber'] = explode( '/', $exifArray['exif:FNumber'] );$exifArray['exif:FNumber'] = $exifArray['exif:FNumber'][0] / $exifArray['exif:FNumber'][1];$r->row2 = '光圈:F/' . $exifArray['exif:FNumber'];$exifArray['exif:ExposureTime'] = explode( '/', $exifArray['exif:ExposureTime'] );if ( ($exifArray['exif:ExposureTime'][0] / $exifArray['exif:ExposureTime'][1]) >= 1 ){$exifArray['exif:ExposureTime'] = sprintf( "%.1fs", (float)$exifArray['exif:ExposureTime'][0] / $exifArray['exif:ExposureTime'][1] );} else{$exifArray['exif:ExposureTime'] = sprintf( "1/%ds", $exifArray['exif:ExposureTime'][1] / $exifArray['exif:ExposureTime'][0] );}$r->row2 = $r->row2 . ' 快门:' . $exifArray['exif:ExposureTime'];$r->row2 = $r->row2 . ' ISO:' . $exifArray['exif:ISOSpeedRatings'];$exifArray['exif:ExposureBiasValue'] = explode( "/", $exifArray['exif:ExposureBiasValue'] );$exifArray['exif:ExposureBiasValue'] = sprintf( "%1.1feV", ((float)$exifArray['exif:ExposureBiasValue'][0] / $exifArray['exif:ExposureBiasValue'][1] * 100) / 100 );if ( (float)$exifArray['exif:ExposureBiasValue'] > 0 ){$exifArray['exif:ExposureBiasValue'] = "+" . $exifArray['exif:ExposureBiasValue'];}$r->row2 = $r->row2 . ' 补偿:' . $exifArray['exif:ExposureBiasValue'];switch ( $exifArray['exif:MeteringMode'] ){case 0:$exifArray['exif:MeteringMode'] = "未知";break;case 1:$exifArray['exif:MeteringMode'] = "矩阵";break;case 2:$exifArray['exif:MeteringMode'] = "中央重点平均";break;case 3:$exifArray['exif:MeteringMode'] = "点测光";break;case 4:$exifArray['exif:MeteringMode'] = "多点测光";break;default:$exifArray['exif:MeteringMode'] = "其它";}$r->row2 = $r->row2 . ' 测光:' . $exifArray['exif:MeteringMode'];switch ( $exifArray['exif:Flash'] ){case 1:$exifArray['exif:Flash'] = "开启闪光灯";break;}$r->row2 = $r->row2 . ' ' . $exifArray['exif:Flash'];if ( $exifArray['exif:FocalLengthIn35mmFilm'] ){$r->row3 = '等效焦距:' . $exifArray['exif:FocalLengthIn35mmFilm'] . "mm";} else{$exifArray['exif:FocalLength'] = explode( "/", $exifArray['exif:FocalLength'] );$exifArray['exif:FocalLength'] = sprintf( "%4.1fmm", (double)$exifArray['exif:FocalLength'][0] / $exifArray['exif:FocalLength'][1] );$r->row3 = '焦距:' . $exifArray['exif:FocalLength'];}$r->row3 = $r->row3 . ' 原始像素:' . $exifArray['exif:ExifImageWidth'] . 'x' . $exifArray['exif:ExifImageLength'] . 'px';if ( $exifArray['exif:Software'] ){$r->row3 = $r->row3 . ' 后期:' . $exifArray['exif:Software'];}return $r;}

php 图片处理库 Imagick 代替 gd相关推荐

  1. PHP7Grafika,PHP图片处理库Grafika详细教程(3):图像属性处理

    该文章是接着上篇文章,<PHP极其强大的图片处理库Grafika详细教程(2):图像特效处理模块>,由于grafika功能太多,所以分开写,其他的点击这里 该文章主要写grafika的图像 ...

  2. PHP极其强大的图片处理库Grafika详细教程(3):图像属性处理

    该文章是接着上篇文章,<PHP极其强大的图片处理库Grafika详细教程(2):图像特效处理模块>,由于grafika功能太多,所以分开写,其他的点击这里 <1.图像基本处理> ...

  3. PHP极其强大的图片处理库Grafika详细教程(4):图形绘制

    该文章是接着上一篇文章:<PHP极其强大的图片处理库Grafika详细教程(3):图像属性处理>,是grafika教程的一个部分. 所有的教程目录 <1.图像基本处理> < ...

  4. PHP极其强大的图片处理库Grafika详细教程(1):图像基本处理

    Grafika是一个PHP图像处理库,是基于Imagick和GD,可以用于改变图片大小,剪裁,比较,添加水印等等功能.还有感知哈希,高级图像过滤,绘制贝塞尔曲线等功能,可谓非常强大. <1.图像 ...

  5. php 处理图像库,PHP图片处理库Grafika详细教程(1):图像基本处理

    Grafika是一个PHP图像处理库,是基于Imagick和GD,可以用于改变图片大小,剪裁,比较,添加水印等等功能.还有感知哈希,高级图像过滤,绘制贝塞尔曲线等功能,可谓非常强大. 由于功能太多,所 ...

  6. PHP图片融合处理,PHP极其强大的图片处理库Grafika详细教程(1):图像基本处理...

    Grafika是一个PHP图像处理库,是基于Imagick和GD,可以用于改变图片大小,剪裁,比较,添加水印等等功能.还有感知哈希,高级图像过滤,绘制贝塞尔曲线等功能,可谓非常强大. 由于功能太多,所 ...

  7. think php 缩放图片,thinkphp极其强大的图片处理库Grafika详细教程(1)

    Grafika是一个PHP图像处理库,是基于Imagick和GD,可以用于改变图片大小,剪裁,比较,添加水印等等功能.还有感知哈希,高级图像过滤,绘制贝塞尔曲线等功能,可谓非常强大. 由于功能太多,所 ...

  8. PHP图片处理库Grafika详细教程(4):图形绘制

    该文章是接着上篇文章,<PHP极其强大的图片处理库Grafika详细教程(3):图像属性处理>,是grafika教程的一个部分. 所有的教程目录 <1.图像基本处理> < ...

  9. android知乎多图片选择,知乎开源图片选择库 Matisse

    原标题:知乎开源图片选择库 Matisse 我的引言 Matisse,知乎开源,简洁,易用,不错的图片选择库. 效果预览 项目简介 1.直接在 Activity 和 Fragment 中调用即可: 2 ...

最新文章

  1. 一个完整的Installshield安装程序实例—艾泽拉斯之海洋女神出品(三) --高级设置一...
  2. python web项目案例教程_Python Web开发案例教程(慕课版)——使用Flask、Tornado、Django...
  3. 中国联通李福昌:探索无线连接的未来
  4. java------LinkedHashMap
  5. springmvc中的类型转换器
  6. [agc016e]poor turkeys
  7. [云炬创业管理笔记]第一章测试1
  8. boost::detail::spinlock_pool相关的测试程序
  9. POJ-3067 Japan(树状数组、线段树)
  10. 第三次学JAVA再学不好就吃翔(part40)--import关键字
  11. Redis PK Memcached,哪个更牛叉
  12. JVM 内存示意图(内存结构图/内存解析图)
  13. Server.Transfer 和Response.Redirect 比较
  14. 《大数据》第1期——创刊寄语
  15. linux下c语言线程传参数,【linux】C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0...
  16. PHP经验——获得PHP版本信息及版本比较
  17. 设计模式网上资料整合理解——行为型模式(一)
  18. 【STP】生成树协议及STP 802.1D (上)
  19. shell批量修改后缀_Powershell批量修改用户的UPN后缀
  20. groupby常用方法

热门文章

  1. 超效率dea模型_【探索】基于超效率DEA模型的我国公立医院排行榜研究
  2. CentOS7 通过 YUM 升级 VIM8
  3. Linux_SquidProxyServer代理服务器
  4. Linux_NIS+NFS+Autofs
  5. AMG8833的使用与stm32驱动代码
  6. notepad++主题
  7. 字符设备驱动程序之poll机制
  8. SecureCRT错误:The client has
  9. (转载)Xcode中other linker flags的作用
  10. 算法笔记_218:花朵数(Java)