欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-09-28 16:24:11
本文实例讲述了php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法。分享给大家供大家参考。具体分析如下: 一个可以供php调用imagemagick功能的...

本文实例讲述了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程序设计有所帮助。