php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法


Posted in PHP onDecember 15, 2014

本文实例讲述了php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法。分享给大家供大家参考。具体分析如下:

一个可以供PHP调用ImageMagick功能的PHP扩展。使用这个扩展可以使PHP具备和ImageMagick相同的功能。

ImageMagick是一套功能强大、稳定而且免费的工具集和开发包,可以用来读、写和处理超过185种基本格式的图片文件,包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式。利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存。

php_imagick是PHP对图片处理的一个扩展包,可以完成对图片改变大小、旋转、锐化、减色或增加特效等操作。

一、windows下安装Imagick扩展:

1、下载 ImageMagick并安装

http://image_magick.veidrodis.com/image_magick/binaries/ImageMagick-6.6.2-10-Q16-windows-dll.exe

2、下载php_imagick.dll

http://valokuva.org/outside-blog-content/imagick-windows-builds/php53/imagick-2.3.0-dev/vc9_nts/php_imagick.dll

如果你用的是线程安全的php,请下载

http://valokuva.org/outside-blog-content/imagick- windows-builds/php53/imagick-2.3.0-dev/vc9_zts/php_imagick.dll

3、设置

在php.ini中添加

extension=php_imagick.dll ,重启web server

二、linux下安装Imagick扩展:

1.yum安装ImageMagick

yum install ImageMagick ImageMagick-devel

2.测试是否安装成功

convert -version

3.安装imagick扩展
 
01.wget http://pecl.php.net/get/imagick-3.1.0RC2.tgz02.tar xzvf imagick-3.1.0RC2.tgz03.cd imagick-3.1.0RC204.phpize05../configure06.make07.make install

4.编辑php.ini文件,在文件末尾添加如下代码

extension=imagick.so

5. 重新启动apache服务器

service httpd restart

三、案例

1. 边框处理

header('Content-type: image/jpeg');  

$image = new Imagick('test.jpg');  

$color=new ImagickPixel();  

$color->setColor("rgb(220,220,220)");  

$image->borderImage($color,5,4);  

$image->blurImage(5,5,imagick::CHANNEL_GREEN);  

echo $image;

我们先来看个简单的实例

php_imagick程序示例

1.创建一个缩略图并显示出来

<?php  

header('Content-type: image/jpeg');  

$image = new Imagick('image.jpg');  

// If 0 is provided as a width or height parameter,// aspect ratio is maintained  

$image->thumbnailImage(100, 0);  

echo $image;  

?>

2.创建一个目录下的缩略图,并保存
<?php  

$images = new Imagick(glob('images/*.JPG'));  

foreach($images as $image) {  

// Providing 0 forces thumbnailImage to maintain aspect ratio   

$image->thumbnailImage(1024,0);  

}  

$images->writeImages();  

?>

3.缩略GIF动画图片
<?php  

/* Create a new imagick object and read in GIF */ 

$im = new Imagick("example.gif");  

/* Resize all frames */ 

foreach ($im as $frame) {  

/* 50x50 frames */ 

$frame->thumbnailImage(50, 50);  

/* Set the virtual canvas to correct size */ 

$frame->setImagePage(50, 50, 0, 0);  

}/* Notice writeImages instead of writeImage */ 

$im->writeImages("example_small.gif", true);  

?>

现在我们进入正题吧,

示例:

裁切/生成缩略图/添加水印, 自动检测和处理 GIF

调用方式:

include 'imagick.class.php';  

$image = new lib_image_imagick();  

$image->open('a.gif');  

$image->resize_to(100, 100, 'scale_fill');  

$image->add_text('1024i.com', 10, 20);  

$image->add_watermark('1024i.gif', 10, 50);  

$image->save_to('x.gif'); 

imagick.class.php
<?php  

class lib_image_imagick  

{  

 private $image = null;  

 private $type = null;  

 // 构造函数  

 public function __construct(){}  

 

 // 析构函数  

 public function __destruct()  

 {  

     if($this->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( $img->getImageDelay() );  

                $canvas->setImagePage($width, $height, 0, 0);  

            }  

              

            $image->destroy();  

         $this->image = $canvas;  

     }  

     else 

     {  

         $this->image->cropImage($width, $height, $x, $y);  

     }  

 }  

 /*

 * 更改图像大小  

 $fit: 适应大小方式  

 'force': 把图片强制变形成 $width X $height 大小  

 'scale': 按比例在安全框 $width X $height 内缩放图片, 输出缩放后图像大小 不完全等于 $width X $height  

 'scale_fill': 按比例在安全框 $width X $height 内缩放图片,安全框内没有像素的地方填充色, 使用此参数时可设置背景填充色 $bg_color = array(255,255,255)(红,绿,蓝, 透明度) 透明度(0不透明-127完全透明))  

 其它: 智能模能 缩放图像并载取图像的中间部分 $width X $height 像素大小  

 $fit = 'force','scale','scale_fill' 时: 输出完整图像  

 $fit = 图像方位值 时, 输出指定位置部分图像   

 字母与图像的对应关系如下:  

   

 north_west   north   north_east  

   

 west         center        east  

   

 south_west   south   south_east  

   

 */ 

 public function resize_to($width = 100, $height = 100, $fit = 'center', $fill_color = array(255,255,255,0) )  

 {  

       

     switch($fit)  

     {  

         case 'force':  

             if($this->type=='gif')  

             {  

                 $image = $this->image;  

                 $canvas = new Imagick();  

                   

                 $images = $image->coalesceImages();  

                 foreach($images as $frame){  

                     $img = new Imagick();  

                     $img->readImageBlob($frame);  

                        $img->thumbnailImage( $width, $height, false );  

                        $canvas->addImage( $img );  

                        $canvas->setImageDelay( $img->getImageDelay() );  

                    }  

                    $image->destroy();  

                 $this->image = $canvas;  

             }  

             else 

             {  

                 $this->image->thumbnailImage( $width, $height, false );  

             }  

             break;  

         case 'scale':  

             if($this->type=='gif')  

             {  

                 $image = $this->image;  

                 $images = $image->coalesceImages();  

                 $canvas = new Imagick();  

                 foreach($images as $frame){  

                     $img = new Imagick();  

                     $img->readImageBlob($frame);  

                        $img->thumbnailImage( $width, $height, true );  

                        $canvas->addImage( $img );  

                        $canvas->setImageDelay( $img->getImageDelay() );  

                    }  

                    $image->destroy();  

                 $this->image = $canvas;  

             }  

             else 

             {  

                 $this->image->thumbnailImage( $width, $height, true );  

             }  

             break;  

         case 'scale_fill':  

             $size = $this->image->getImagePage();   

             $src_width = $size['width'];  

             $src_height = $size['height'];  

               

                $x = 0;  

                $y = 0;  

                  

                $dst_width = $width;  

                $dst_height = $height;  

    if($src_width*$height > $src_height*$width)  

    {  

     $dst_height = intval($width*$src_height/$src_width);  

     $y = intval( ($height-$dst_height)/2 );  

    }  

    else 

    {  

     $dst_width = intval($height*$src_width/$src_height);  

     $x = intval( ($width-$dst_width)/2 );  

    }  

                $image = $this->image;  

                $canvas = new Imagick();  

                  

                $color = 'rgba('.$fill_color[0].','.$fill_color[1].','.$fill_color[2].','.$fill_color[3].')';  

             if($this->type=='gif')  

             {  

                 $images = $image->coalesceImages();  

                 foreach($images as $frame)  

                 {  

                     $frame->thumbnailImage( $width, $height, true );  

                     $draw = new ImagickDraw();  

                        $draw->composite($frame->getImageCompose(), $x, $y, $dst_width, $dst_height, $frame);  

                        $img = new Imagick();  

                        $img->newImage($width, $height, $color, 'gif');  

                        $img->drawImage($draw);  

                        $canvas->addImage( $img );  

                        $canvas->setImageDelay( $img->getImageDelay() );  

                        $canvas->setImagePage($width, $height, 0, 0);  

                    }  

             }  

             else 

             {  

                 $image->thumbnailImage( $width, $height, true );  

                   

                 $draw = new ImagickDraw();  

                    $draw->composite($image->getImageCompose(), $x, $y, $dst_width, $dst_height, $image);  

                      

                 $canvas->newImage($width, $height, $color, $this->get_type() );  

                    $canvas->drawImage($draw);  

                    $canvas->setImagePage($width, $height, 0, 0);  

             }  

             $image->destroy();  

             $this->image = $canvas;  

             break;  

   default:  

    $size = $this->image->getImagePage();   

       $src_width = $size['width'];  

             $src_height = $size['height'];  

               

                $crop_x = 0;  

                $crop_y = 0;  

                  

                $crop_w = $src_width;  

                $crop_h = $src_height;  

                  

          if($src_width*$height > $src_height*$width)  

    {  

     $crop_w = intval($src_height*$width/$height);  

    }  

    else 

    {  

        $crop_h = intval($src_width*$height/$width);  

    }  

                  

       switch($fit)  

             {  

        case 'north_west':  

            $crop_x = 0;  

            $crop_y = 0;  

            break;  

           case 'north':  

               $crop_x = intval( ($src_width-$crop_w)/2 );  

               $crop_y = 0;  

               break;  

           case 'north_east':  

               $crop_x = $src_width-$crop_w;  

               $crop_y = 0;  

               break;  

           case 'west':  

               $crop_x = 0;  

               $crop_y = intval( ($src_height-$crop_h)/2 );  

               break;  

           case 'center':  

               $crop_x = intval( ($src_width-$crop_w)/2 );  

               $crop_y = intval( ($src_height-$crop_h)/2 );  

               break;  

           case 'east':  

               $crop_x = $src_width-$crop_w;  

               $crop_y = intval( ($src_height-$crop_h)/2 );  

               break;  

           case 'south_west':  

               $crop_x = 0;  

               $crop_y = $src_height-$crop_h;  

               break;  

           case 'south':  

               $crop_x = intval( ($src_width-$crop_w)/2 );  

               $crop_y = $src_height-$crop_h;  

               break;  

           case 'south_east':  

               $crop_x = $src_width-$crop_w;  

               $crop_y = $src_height-$crop_h;  

               break;  

           default:  

               $crop_x = intval( ($src_width-$crop_w)/2 );  

               $crop_y = intval( ($src_height-$crop_h)/2 );  

             }  

               

             $image = $this->image;  

             $canvas = new Imagick();  

               

          if($this->type=='gif')  

             {  

                 $images = $image->coalesceImages();  

                 foreach($images as $frame){  

                     $img = new Imagick();  

                     $img->readImageBlob($frame);  

                        $img->cropImage($crop_w, $crop_h, $crop_x, $crop_y);  

                        $img->thumbnailImage( $width, $height, true );  

                          

                        $canvas->addImage( $img );  

                        $canvas->setImageDelay( $img->getImageDelay() );  

                        $canvas->setImagePage($width, $height, 0, 0);  

                    }  

             }  

             else 

             {  

                 $image->cropImage($crop_w, $crop_h, $crop_x, $crop_y);  

                 $image->thumbnailImage( $width, $height, true );  

                 $canvas->addImage( $image );  

                 $canvas->setImagePage($width, $height, 0, 0);  

             }  

             $image->destroy();  

             $this->image = $canvas;  

     }  

       

 }  

   

 // 添加水印图片  

 public function add_watermark($path, $x = 0, $y = 0)  

 {  

        $watermark = new Imagick($path);  

        $draw = new ImagickDraw();  

        $draw->composite($watermark->getImageCompose(), $x, $y, $watermark->getImageWidth(), $watermark->getimageheight(), $watermark);  

     if($this->type=='gif')  

     {  

         $image = $this->image;  

            $canvas = new Imagick();  

         $images = $image->coalesceImages();  

         foreach($image as $frame)  

         {  

                $img = new Imagick();  

             $img->readImageBlob($frame);  

                $img->drawImage($draw);  

                  

                $canvas->addImage( $img );  

                $canvas->setImageDelay( $img->getImageDelay() );  

            }  

            $image->destroy();  

         $this->image = $canvas;  

     }  

     else 

     {  

         $this->image->drawImage($draw);  

     }  

 }  

   

 // 添加水印文字  

 public function add_text($text, $x = 0 , $y = 0, $angle=0, $style=array())  

 {  

        $draw = new ImagickDraw();  

        if(isset($style['font'])) $draw->setFont($style['font']);  

        if(isset($style['font_size'])) $draw->setFontSize($style['font_size']);  

     if(isset($style['fill_color'])) $draw->setFillColor($style['fill_color']);  

     if(isset($style['under_color'])) $draw->setTextUnderColor($style['under_color']);  

       

     if($this->type=='gif')  

     {  

         foreach($this->image as $frame)  

         {  

             $frame->annotateImage($draw, $x, $y, $angle, $text);  

         }  

     }  

     else 

     {  

         $this->image->annotateImage($draw, $x, $y, $angle, $text);  

     }  

 }  

   

 // 保存到指定路径  

 public function save_to( $path )  

 {  

     if($this->type=='gif')  

     {  

         $this->image->writeImages($path, true);  

     }  

     else 

     {  

         $this->image->writeImage($path);  

     }  

 }  

 // 输出图像  

 public function output($header = true)  

 {  

     if($header) header('Content-type: '.$this->type);  

     echo $this->image->getImagesBlob();    

 }  

   

 public function get_width()  

 {  

        $size = $this->image->getImagePage();   

        return $size['width'];  

 }  

   

 public function get_height()  

 {  

     $size = $this->image->getImagePage();   

        return $size['height'];  

 }  

 // 设置图像类型, 默认与源类型一致  

 public function set_type( $type='png' )  

 {  

     $this->type = $type;  

        $this->image->setImageFormat( $type );  

 }  

 // 获取源图像类型  

 public function get_type()  

 {  

  return $this->type;  

 }  

 

 // 当前对象是否为图片  

 public function is_image()  

 {  

  if( $this->image )  

   return true;  

  else 

   return false;  

 }  

 

 public function thumbnail($width = 100, $height = 100, $fit = true){ $this->image->thumbnailImage( $width, $height, $fit );} // 生成缩略图 $fit为真时将保持比例并在安全框 $width X $height 内生成缩略图片  

 /*

 添加一个边框  

 $width: 左右边框宽度  

 $height: 上下边框宽度  

 $color: 颜色: RGB 颜色 'rgb(255,0,0)' 或 16进制颜色 '#FF0000' 或颜色单词 'white'/'red'...  

 */ 

 public function border($width, $height, $color='rgb(220, 220, 220)')  

 {  

  $color=new ImagickPixel();  

  $color->setColor($color);  

  $this->image->borderImage($color, $width, $height);  

 }  

   

 public function blur($radius, $sigma){$this->image->blurImage($radius, $sigma);} // 模糊  

 public function gaussian_blur($radius, $sigma){$this->image->gaussianBlurImage($radius, $sigma);} // 高斯模糊  

 public function motion_blur($radius, $sigma, $angle){$this->image->motionBlurImage($radius, $sigma, $angle);} // 运动模糊  

 public function radial_blur($radius){$this->image->radialBlurImage($radius);} // 径向模糊  

 public function add_noise($type=null){$this->image->addNoiseImage($type==null?imagick::NOISE_IMPULSE:$type);} // 添加噪点  

   

 public function level($black_point, $gamma, $white_point){$this->image->levelImage($black_point, $gamma, $white_point);} // 调整色阶  

 public function modulate($brightness, $saturation, $hue){$this->image->modulateImage($brightness, $saturation, $hue);} // 调整亮度、饱和度、色调  

 public function charcoal($radius, $sigma){$this->image->charcoalImage($radius, $sigma);} // 素描  

 public function oil_paint($radius){$this->image->oilPaintImage($radius);} // 油画效果  

   

 public function flop(){$this->image->flopImage();} // 水平翻转  

 public function flip(){$this->image->flipImage();} // 垂直翻转  

}

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP出错界面
Oct 09 PHP
php代码优化及php相关问题总结
Oct 09 PHP
PHP脚本的10个技巧(8)
Oct 09 PHP
利用discuz自带通行证整合dedecms的方法以及文件下载
Mar 06 PHP
用PHP控制用户的浏览器--ob*函数的使用说明
Mar 16 PHP
php file_get_contents函数轻松采集html数据
Apr 22 PHP
php自动加载的两种实现方法
Jun 21 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 PHP
浅析Laravel5中队列的配置及使用
Aug 04 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
Jun 20 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
Dec 15 #PHP
php实现可用于mysql,mssql,pg数据库操作类
Dec 13 #PHP
PHP中Memcache操作类及用法实例
Dec 12 #PHP
PHP实现PDO的mysql数据库操作类
Dec 12 #PHP
PHP实现的sqlite数据库连接类
Dec 12 #PHP
php+mysql数据库实现无限分类的方法
Dec 12 #PHP
PHP中if和or运行效率对比
Dec 12 #PHP
You might like
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
php中socket的用法详解
2014/10/24 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
PHP模板引擎smarty详细介绍
2015/05/26 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
解决vue scoped html样式无效的问题
2020/10/24 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
Python 关于反射和类的特殊成员方法
2017/09/14 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
人事主管的岗位职责
2013/11/16 职场文书
网上开店必备创业计划书
2014/01/26 职场文书
广告业务员岗位职责
2014/02/06 职场文书
企业活动策划方案
2014/06/02 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
校运动会广播稿300字
2014/10/07 职场文书
学年个人总结范文
2015/03/05 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
文艺晚会开场白
2015/05/29 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书