给骨头系统开发的图像库的 imagick 部分 ,支持 gif , 完美支持裁切、生成缩略图、添加水印 。
支持按方位生成缩略图像, 如:
// 把左上角优先 $image->resize_to(100, 100, 'north_west'); // 右边优先 $image->resize_to(100, 100, 'east'); ...
更多参数看源代码
原图
效果图
php有一款插件叫做imagemagick,功能很强大,提供了图片的很多操作,图片剪切、压缩、合并、插入文本、背景色透明等。并且有api方法调用和命令行操作两种方式,如果只是简单处理的话建议api方法调用,如果是很复杂的操作建议服务器端搭shell命令行操作,因为api方法调用同操作对比命令行他更吃内存,并且效率没有命令行那么高。
本文章就对于这些常见操作进行介绍说明
首先要提一声的时候每次通过imageMagic处理图片都会new一个对象出来,当图片处理好之后最好是把这个对象给销毁,它会占用cpu和内存,如果你不在乎这些小细节的话就当做我没有说,接下来进入正题。
图片宽高压缩:通过调用api中的 thumbnailImage 方法,可以实现图片宽高设置,这个操作不会影响图片的质量,是同大小压缩。
代码如下
1 $codeLogo = new \Imagick( '图片路径' );2 $codeLogo->thumbnailImage( '图片高','图片宽'); 3 header("Content-Type: image/{$image->getImageFormat()}"); 4 echo codeLogo; 5 exit;
图片存储大小压缩:通过调用api中的 setImageCompressionQuality 方法,可以实现图片存储大小设置,但是后带参数越小那么图片清晰度越差,但是图片存储大小会越小那么web加载的时候就越快,压缩率请根据实际情况进行调整。
代码如下
code = new \Imagick( '图片路径' ); $code->setImageCompressionQuality('缩放比例'); header("Content-Type: image/{$image->getImageFormat()}"); echo $image->getImageBlob( );
图片合并: 通过imageMagick可以实现多个图片合并到一张图片中,但是在合并的时候需要根据被覆盖图片的高和宽来确定覆盖图片的xy坐标,获取被覆盖图片的高和宽可以通过方法getImageGeometry来获取图片属性,然后得到高和宽,然后进行定位计算,下边的代码是将覆盖图片水平、垂直居中。
代码如下
$code = new \Imagick( '被覆盖图片路径'); $codePro
给图片添加水印,是一个很常见的需求。但是该需求的实现却不简单。
通常添加文字水印,是gd库的imagefttext方法。但是尝试之后,发现图片变成静态了。不符合需求。
利用搜索引擎,查询无数,发现gd扩展不合适解决这个问题。此时需要使用一个新的扩展
imagick
该扩展除了在gif图片过大的情况,存在速度问题,其他情况下表现良好。
在尝试了很多教程,失败无数次。于是忍痛去阅读英文文档,写出正确的代码。
代码如下:
$im = new Imagick("2.gif"); $draw = new ImagickDraw(); $draw->setFont('LOKICOLA.TTF'); $draw->setFontSize( 50 ); $draw->setFillColor(new ImagickPixel("red")); $text = "wuwenfu"; foreach ($im as $frame) { $frame->annotateImage($draw, 100, 120, 0, $text); } //写入到文件 //$im->writeImages("2_small.gif", true); //输出到浏览器。 header( "Content-Type: image/gif" ); echo $im->getImagesBlob();
原图:
给骨头系统开发的图像库的 imagick 部分 ,支持 gif , 完美支持裁切、生成缩略图、添加水印 。
支持按方位生成缩略图像, 如:
// 把左上角优先 $image->resize_to(100, 100, 'north_west'); // 右边优先 $image->resize_to(100, 100, 'east'); ...
更多参数看源代码
原图
效果图
image!==null) $this->image->destroy(); } // 载入图像 public function open($path) { $this->image = new Imagick( $path ); if($this->image) { $this->type = strtolower($this->image->getImageFormat()); } return $this->image; } public function crop($x=0, $y=0, $width=null, $height=null) { if($width==null) $width = $this->image->getImageWidth()-$x; if($height==null) $height = $this->image->getImageHeight()-$y; if($width<=0 || $height<=0) return; if($this->type=='gif') { $image = $this->image; $canvas = new Imagick(); $images = $image->coalesceImages(); foreach($images as $frame){ $img = new Imagick(); $img->readImageBlob($frame); $img->cropImage($width, $height, $x, $y); $canvas->addImage( $img ); $canvas->setImageDelay( $im