当前位置:首页 > PHP教程 > php图像处理 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2013-11-14 18:39:05 浏览: 评论:0 

一个可以供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. 边框处理

  1. //by www.phpfensi.com  
  2. header('Content-type: image/jpeg');  
  3. $image = new Imagick('test.jpg');  
  4. $color=new ImagickPixel();  
  5. $color->setColor("rgb(220,220,220)");  
  6. $image->borderImage($color,5,4);  
  7. $image->blurImage(5,5,imagick::CHANNEL_GREEN);  
  8. echo $image

我们先来看个简单的实例

php_imagick程序示例

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

  1. <?php  
  2. header('Content-type: image/jpeg');  
  3. $image = new Imagick('image.jpg');  
  4. // If 0 is provided as a width or height parameter,// aspect ratio is maintained  
  5. $image->thumbnailImage(100, 0);  
  6. echo $image;  
  7. ?> 

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

  1. <?php  
  2. $images = new Imagick(glob('images/*.JPG'));  
  3. foreach($images as $image) {  
  4. // Providing 0 forces thumbnailImage to maintain aspect ratio   
  5. $image->thumbnailImage(1024,0);  
  6. }  
  7. $images->writeImages();  
  8. ?> 

3.缩略GIF动画图片

  1. <?php  
  2. /* Create a new imagick object and read in GIF */ 
  3. $im = new Imagick("example.gif");  
  4. /* Resize all frames */ 
  5. foreach ($im as $frame) {  
  6. /* 50x50 frames */ 
  7. $frame->thumbnailImage(50, 50);  
  8. /* Set the virtual canvas to correct size */ 
  9. $frame->setImagePage(50, 50, 0, 0);  
  10. }/* Notice writeImages instead of writeImage */ 
  11. $im->writeImages("example_small.gif", true);  
  12. ?> 

现在我们进入正题吧,

例1

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

调用方式:

  1. include 'imagick.class.php';  
  2. $image = new lib_image_imagick();  
  3. $image->open('a.gif');  
  4. $image->resize_to(100, 100, 'scale_fill');  
  5. $image->add_text('1024i.com', 10, 20);  
  6. $image->add_watermark('1024i.gif', 10, 50);  
  7. $image->save_to('x.gif'); 

imagick.class.php 

  1. <?php  
  2. class lib_image_imagick  
  3. {  
  4.  private $image = null;  
  5.  private $type = null;  
  6.  // 构造函数  
  7.  public function __construct(){}  
  8.  
  9.  // 析构函数  
  10.  public function __destruct()  
  11.  {  
  12.      if($this->image!==null) $this->image->destroy();   
  13.  }  
  14.  // 载入图像  
  15.  public function open($path)  
  16.  {  
  17.   $this->image = new Imagick( $path );  
  18.   if($this->image)  
  19.   {  
  20.       $this->type = strtolower($this->image->getImageFormat());  
  21.   }  
  22.   return $this->image;  
  23.  }  
  24.    
  25.  public function crop($x=0, $y=0, $width=null, $height=null)  
  26.  {  
  27.      if($width==null) $width = $this->image->getImageWidth()-$x;  
  28.      if($height==null) $height = $this->image->getImageHeight()-$y;  
  29.      if($width<=0 || $height<=0) return;  
  30.        
  31.      if($this->type=='gif')  
  32.      {  
  33.             $image = $this->image;  
  34.          $canvas = new Imagick();  
  35.            
  36.          $images = $image->coalesceImages();  
  37.          foreach($images as $frame){  
  38.              $img = new Imagick();  
  39.              $img->readImageBlob($frame);  
  40.                 $img->cropImage($width$height$x$y);  
  41.                 $canvas->addImage( $img );  
  42.                 $canvas->setImageDelay( $img->getImageDelay() );  
  43.                 $canvas->setImagePage($width$height, 0, 0);  
  44.             }  
  45.               
  46.             $image->destroy();  
  47.          $this->image = $canvas;  
  48.      }  
  49.      else 
  50.      {  
  51.          $this->image->cropImage($width$height$x$y);  
  52.      }  
  53.  }  
  54.  /*
  55.  * 更改图像大小  
  56.  $fit: 适应大小方式  
  57.  'force': 把图片强制变形成 $width X $height 大小  
  58.  'scale': 按比例在安全框 $width X $height 内缩放图片, 输出缩放后图像大小 不完全等于 $width X $height  
  59.  'scale_fill': 按比例在安全框 $width X $height 内缩放图片,安全框内没有像素的地方填充色, 使用此参数时可设置背景填充色 $bg_color = array(255,255,255)(红,绿,蓝, 透明度) 透明度(0不透明-127完全透明))  
  60.  其它: 智能模能 缩放图像并载取图像的中间部分 $width X $height 像素大小  
  61.  $fit = 'force','scale','scale_fill' 时: 输出完整图像  
  62.  $fit = 图像方位值 时, 输出指定位置部分图像   
  63.  字母与图像的对应关系如下:  
  64.    
  65.  north_west   north   north_east  
  66.    
  67.  west         center        east  
  68.    
  69.  south_west   south   south_east  
  70.    
  71.  */ 
  72.  public function resize_to($width = 100, $height = 100, $fit = 'center'$fill_color = array(255,255,255,0) )  
  73.  {  
  74.        
  75.      switch($fit)  
  76.      {  
  77.          case 'force':  
  78.              if($this->type=='gif')  
  79.              {  
  80.                  $image = $this->image;  
  81.                  $canvas = new Imagick();  
  82.                    
  83.                  $images = $image->coalesceImages();  
  84.                  foreach($images as $frame){  
  85.                      $img = new Imagick();  
  86.                      $img->readImageBlob($frame);  
  87.                         $img->thumbnailImage( $width$height, false );  
  88.                         $canvas->addImage( $img );  
  89.                         $canvas->setImageDelay( $img->getImageDelay() );  
  90.                     }  
  91.                     $image->destroy();  
  92.                  $this->image = $canvas;  
  93.              }  
  94.              else 
  95.              {  
  96.                  $this->image->thumbnailImage( $width$height, false );  
  97.              }  
  98.              break;  
  99.          case 'scale':  
  100.              if($this->type=='gif')  
  101.              {  
  102.                  $image = $this->image;  
  103.                  $images = $image->coalesceImages();  
  104.                  $canvas = new Imagick();  
  105.                  foreach($images as $frame){  
  106.                      $img = new Imagick();  
  107.                      $img->readImageBlob($frame);  
  108.                         $img->thumbnailImage( $width$height, true );  
  109.                         $canvas->addImage( $img );  
  110.                         $canvas->setImageDelay( $img->getImageDelay() );  
  111.                     }  
  112.                     $image->destroy();  
  113.                  $this->image = $canvas;  
  114.              }  
  115.              else 
  116.              {  
  117.                  $this->image->thumbnailImage( $width$height, true );  
  118.              }  
  119.              break;  
  120.          case 'scale_fill':  
  121.              $size = $this->image->getImagePage();   
  122.              $src_width = $size['width'];  
  123.              $src_height = $size['height'];  
  124.                
  125.                 $x = 0;  
  126.                 $y = 0;  
  127.                   
  128.                 $dst_width = $width;  
  129.                 $dst_height = $height;  
  130.        if($src_width*$height > $src_height*$width)  
  131.     {  
  132.      $dst_height = intval($width*$src_height/$src_width);  
  133.      $y = intval( ($height-$dst_height)/2 );  
  134.     }  
  135.     else 
  136.     {  
  137.      $dst_width = intval($height*$src_width/$src_height);  
  138.      $x = intval( ($width-$dst_width)/2 );  
  139.     }  
  140.                 $image = $this->image;  
  141.                 $canvas = new Imagick();  
  142.                   
  143.                 $color = 'rgba('.$fill_color[0].','.$fill_color[1].','.$fill_color[2].','.$fill_color[3].')';  
  144.              if($this->type=='gif')  
  145.              {  
  146.                  $images = $image->coalesceImages();  
  147.                  foreach($images as $frame)  
  148.                  {  
  149.                      $frame->thumbnailImage( $width$height, true );  
  150.                      $draw = new ImagickDraw();  
  151.                         $draw->composite($frame->getImageCompose(), $x$y$dst_width$dst_height$frame);  
  152.                         $img = new Imagick();  
  153.                         $img->newImage($width$height$color'gif');  
  154.                         $img->drawImage($draw);  
  155.                         $canvas->addImage( $img );  
  156.                         $canvas->setImageDelay( $img->getImageDelay() );  
  157.                         $canvas->setImagePage($width$height, 0, 0);  
  158.                     }  
  159.              }  
  160.              else 
  161.              {  
  162.                  $image->thumbnailImage( $width$height, true );  
  163.                    
  164.                  $draw = new ImagickDraw();  
  165.                     $draw->composite($image->getImageCompose(), $x$y$dst_width$dst_height$image);  
  166.                       
  167.                  $canvas->newImage($width$height$color$this->get_type() );  
  168.                     $canvas->drawImage($draw);  
  169.                     $canvas->setImagePage($width$height, 0, 0);  
  170.              }  
  171.              $image->destroy();  
  172.              $this->image = $canvas;  
  173.              break;  
  174.    default:  
  175.     $size = $this->image->getImagePage();   
  176.        $src_width = $size['width'];  
  177.              $src_height = $size['height'];  
  178.                
  179.                 $crop_x = 0;  
  180.                 $crop_y = 0;  
  181.                   
  182.                 $crop_w = $src_width;  
  183.                 $crop_h = $src_height;  
  184.                   
  185.           if($src_width*$height > $src_height*$width)  
  186.     {  
  187.      $crop_w = intval($src_height*$width/$height);  
  188.     }  
  189.     else 
  190.     {  
  191.         $crop_h = intval($src_width*$height/$width);  
  192.     }  
  193.                   
  194.        switch($fit)  
  195.              {  
  196.         case 'north_west':  
  197.             $crop_x = 0;  
  198.             $crop_y = 0;  
  199.             break;  
  200.            case 'north':  
  201.                $crop_x = intval( ($src_width-$crop_w)/2 );  
  202.                $crop_y = 0;  
  203.                break;  
  204.            case 'north_east':  
  205.                $crop_x = $src_width-$crop_w;  
  206.                $crop_y = 0;  
  207.                break;  
  208.            case 'west':  
  209.                $crop_x = 0;  
  210.                $crop_y = intval( ($src_height-$crop_h)/2 );  
  211.                break;  
  212.            case 'center':  
  213.                $crop_x = intval( ($src_width-$crop_w)/2 );  
  214.                $crop_y = intval( ($src_height-$crop_h)/2 );  
  215.                break;  
  216.            case 'east':  
  217.                $crop_x = $src_width-$crop_w;  
  218.                $crop_y = intval( ($src_height-$crop_h)/2 );  
  219.                break;  
  220.            case 'south_west':  
  221.                $crop_x = 0;  
  222.                $crop_y = $src_height-$crop_h;  
  223.                break;  
  224.            case 'south':  
  225.                $crop_x = intval( ($src_width-$crop_w)/2 );  
  226.                $crop_y = $src_height-$crop_h;  
  227.                break;  
  228.            case 'south_east':  
  229.                $crop_x = $src_width-$crop_w;  
  230.                $crop_y = $src_height-$crop_h;  
  231.                break;  
  232.            default:  
  233.                $crop_x = intval( ($src_width-$crop_w)/2 );  
  234.                $crop_y = intval( ($src_height-$crop_h)/2 );  
  235.              }  
  236.                
  237.              $image = $this->image;  
  238.              $canvas = new Imagick();  
  239.                
  240.           if($this->type=='gif')  
  241.              {  
  242.                  $images = $image->coalesceImages();  
  243.                  foreach($images as $frame){  
  244.                      $img = new Imagick();  
  245.                      $img->readImageBlob($frame);  
  246.                         $img->cropImage($crop_w$crop_h$crop_x$crop_y);  
  247.                         $img->thumbnailImage( $width$height, true );  
  248.                           
  249.                         $canvas->addImage( $img );  
  250.                         $canvas->setImageDelay( $img->getImageDelay() );  
  251.                         $canvas->setImagePage($width$height, 0, 0);  
  252.                     }  
  253.              }  
  254.              else 
  255.              {  
  256.                  $image->cropImage($crop_w$crop_h$crop_x$crop_y);  
  257.                  $image->thumbnailImage( $width$height, true );  
  258.                  $canvas->addImage( $image );  
  259.                  $canvas->setImagePage($width$height, 0, 0);  
  260.              }  
  261.              $image->destroy();  
  262.              $this->image = $canvas;  
  263.      }  
  264.        
  265.  }  
  266.    
  267.    
  268.  // 添加水印图片  
  269.  public function add_watermark($path$x = 0, $y = 0)  
  270.  {  
  271.         $watermark = new Imagick($path);  
  272.         $draw = new ImagickDraw();  
  273.         $draw->composite($watermark->getImageCompose(), $x$y$watermark->getImageWidth(), $watermark->getimageheight(), $watermark);  
  274.      if($this->type=='gif')  
  275.      {  
  276.          $image = $this->image;  
  277.             $canvas = new Imagick();  
  278.          $images = $image->coalesceImages();  
  279.          foreach($image as $frame)  
  280.          {  
  281.                 $img = new Imagick();  
  282.              $img->readImageBlob($frame);  
  283.                 $img->drawImage($draw);  
  284.                   
  285.                 $canvas->addImage( $img );  
  286.                 $canvas->setImageDelay( $img->getImageDelay() );  
  287.             }  
  288.             $image->destroy();  
  289.          $this->image = $canvas;  
  290.      }  
  291.      else 
  292.      {  
  293.          $this->image->drawImage($draw);  
  294.      }  
  295.  }  
  296.    
  297.  // 添加水印文字  
  298.  public function add_text($text$x = 0 , $y = 0, $angle=0, $style=array())  
  299.  {  
  300.         $draw = new ImagickDraw();  
  301.         if(isset($style['font'])) $draw->setFont($style['font']);  
  302.         if(isset($style['font_size'])) $draw->setFontSize($style['font_size']);  
  303.      if(isset($style['fill_color'])) $draw->setFillColor($style['fill_color']);  
  304.      if(isset($style['under_color'])) $draw->setTextUnderColor($style['under_color']);  
  305.        
  306.      if($this->type=='gif')  
  307.      {  
  308.          foreach($this->image as $frame)  
  309.          {  
  310.              $frame->annotateImage($draw$x$y$angle$text);  
  311.          }  
  312.      }  
  313.      else 
  314.      {  
  315.          $this->image->annotateImage($draw$x$y$angle$text);  
  316.      }  
  317.  }  
  318.    
  319.    
  320.  // 保存到指定路径  
  321.  public function save_to( $path )  
  322.  {  
  323.      if($this->type=='gif')  
  324.      {  
  325.          $this->image->writeImages($path, true);  
  326.      }  
  327.      else 
  328.      {  
  329.          $this->image->writeImage($path);  
  330.      }  
  331.  }  
  332.  // 输出图像  
  333.  public function output($header = true)  
  334.  {  
  335.      if($header) header('Content-type: '.$this->type);  
  336.      echo $this->image->getImagesBlob();    
  337.  }  
  338.    
  339.  public function get_width()  
  340.  {  
  341.         $size = $this->image->getImagePage();   
  342.         return $size['width'];  
  343.  }  
  344.    
  345.  public function get_height()  
  346.  {  
  347.      $size = $this->image->getImagePage();   
  348.         return $size['height'];  
  349.  }  
  350.  // 设置图像类型, 默认与源类型一致  
  351.  public function set_type( $type='png' )  
  352.  {  
  353.      $this->type = $type;  
  354.         $this->image->setImageFormat( $type );  
  355.  }  
  356.  // 获取源图像类型  
  357.  public function get_type()  
  358.  {  
  359.   return $this->type;  
  360.  }  
  361.  
  362.  // 当前对象是否为图片  
  363.  public function is_image()  
  364.  {  
  365.   if$this->image )  
  366.    return true;  
  367.   else 
  368.    return false;  
  369.  }  
  370.    
  371.  
  372.  public function thumbnail($width = 100, $height = 100, $fit = true){ $this->image->thumbnailImage( $width$height$fit );} // 生成缩略图 $fit为真时将保持比例并在安全框 $width X $height 内生成缩略图片  
  373.  /*
  374.  添加一个边框  
  375.  $width: 左右边框宽度  
  376.  $height: 上下边框宽度  
  377.  $color: 颜色: RGB 颜色 'rgb(255,0,0)' 或 16进制颜色 '#FF0000' 或颜色单词 'white'/'red'...  
  378.  */ 
  379.  public function border($width$height$color='rgb(220, 220, 220)')  
  380.  {  
  381.   $color=new ImagickPixel();  
  382.   $color->setColor($color);  
  383.   $this->image->borderImage($color$width$height);  
  384.  }  
  385.    
  386.  public function blur($radius$sigma){$this->image->blurImage($radius$sigma);} // 模糊  
  387.  public function gaussian_blur($radius$sigma){$this->image->gaussianBlurImage($radius$sigma);} // 高斯模糊  
  388.  public function motion_blur($radius$sigma$angle){$this->image->motionBlurImage($radius$sigma$angle);} // 运动模糊  
  389.  public function radial_blur($radius){$this->image->radialBlurImage($radius);} // 径向模糊  
  390.  public function add_noise($type=null){$this->image->addNoiseImage($type==null?imagick::NOISE_IMPULSE:$type);} // 添加噪点  
  391.    
  392.  public function level($black_point$gamma$white_point){$this->image->levelImage($black_point$gamma$white_point);} // 调整色阶  
  393.  public function modulate($brightness$saturation$hue){$this->image->modulateImage($brightness$saturation$hue);} // 调整亮度、饱和度、色调  
  394.  public function charcoal($radius$sigma){$this->image->charcoalImage($radius$sigma);} // 素描  
  395.  public function oil_paint($radius){$this->image->oilPaintImage($radius);} // 油画效果  
  396.    
  397.  public function flop(){$this->image->flopImage();} // 水平翻转  
  398.  public function flip(){$this->image->flipImage();} // 垂直翻转  

Tags: phpimagick 实现 图片剪切

分享到: