zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

PHP方法 实现 图片 增加 特效 旋转 剪切
2023-06-13 09:15:33 时间

本文实例讲述了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,重启webserver

二、linux下安装Imagick扩展:

1.yum安装ImageMagick

yuminstallImageMagickImageMagick-devel

2.测试是否安装成功

convert-version

3.安装imagick扩展
 
01.wgethttp://pecl.php.net/get/imagick-3.1.0RC2.tgz02.tarxzvfimagick-3.1.0RC2.tgz03.cdimagick-3.1.0RC204.phpize05../configure06.make07.makeinstall

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

extension=imagick.so

5.重新启动apache服务器

servicehttpdrestart

三、案例

1.边框处理

复制代码代码如下:
header("Content-type:image/jpeg"); 
$image=newImagick("test.jpg"); 
$color=newImagickPixel(); 
$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=newImagick("image.jpg"); 
//If0isprovidedasawidthorheightparameter,//aspectratioismaintained 
$image->thumbnailImage(100,0); 
echo$image; 
?>

2.创建一个目录下的缩略图,并保存
复制代码代码如下:<?php 
$images=newImagick(glob("images/*.JPG")); 
foreach($imagesas$image){ 
//Providing0forcesthumbnailImagetomaintainaspectratio  
$image->thumbnailImage(1024,0); 

$images->writeImages(); 
?>
3.缩略GIF动画图片
复制代码代码如下:<?php 
/*CreateanewimagickobjectandreadinGIF*/
$im=newImagick("example.gif"); 
/*Resizeallframes*/
foreach($imas$frame){ 
/*50x50frames*/
$frame->thumbnailImage(50,50); 
/*Setthevirtualcanvastocorrectsize*/
$frame->setImagePage(50,50,0,0); 
}/*NoticewriteImagesinsteadofwriteImage*/
$im->writeImages("example_small.gif",true); 
?>
现在我们进入正题吧,

示例:

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

调用方式:

复制代码代码如下:include"imagick.class.php"; 
$image=newlib_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 
classlib_image_imagick 

 private$image=null; 
 private$type=null; 
 //构造函数 
 publicfunction__construct(){} 
 
 //析构函数 
 publicfunction__destruct() 
 { 
    if($this->image!==null)$this->image->destroy();  
 } 
 //载入图像 
 publicfunctionopen($path) 
 { 
 $this->image=newImagick($path); 
 if($this->image) 
 { 
     $this->type=strtolower($this->image->getImageFormat()); 
 } 
 return$this->image; 
 } 
  
 publicfunctioncrop($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=newImagick(); 
          
        $images=$image->coalesceImages(); 
        foreach($imagesas$frame){ 
            $img=newImagick(); 
            $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":把图片强制变形成$widthX$height大小 
 "scale":按比例在安全框$widthX$height内缩放图片,输出缩放后图像大小不完全等于$widthX$height 
 "scale_fill":按比例在安全框$widthX$height内缩放图片,安全框内没有像素的地方填充色,使用此参数时可设置背景填充色$bg_color=array(255,255,255)(红,绿,蓝,透明度)透明度(0不透明-127完全透明)) 
 其它:智能模能缩放图像并载取图像的中间部分$widthX$height像素大小 
 $fit="force","scale","scale_fill"时:输出完整图像 
 $fit=图像方位值时,输出指定位置部分图像  
 字母与图像的对应关系如下: 
  
 north_west  north  north_east 
  
 west        center       east 
  
 south_west  south  south_east 
  
 */
 publicfunctionresize_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=newImagick(); 
                  
                $images=$image->coalesceImages(); 
                foreach($imagesas$frame){ 
                    $img=newImagick(); 
                    $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=newImagick(); 
                foreach($imagesas$frame){ 
                    $img=newImagick(); 
                    $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=newImagick(); 
                 
               $color="rgba(".$fill_color[0].",".$fill_color[1].",".$fill_color[2].",".$fill_color[3].")"; 
            if($this->type=="gif") 
            { 
                $images=$image->coalesceImages(); 
                foreach($imagesas$frame) 
                { 
                    $frame->thumbnailImage($width,$height,true); 
                    $draw=newImagickDraw(); 
                       $draw->composite($frame->getImageCompose(),$x,$y,$dst_width,$dst_height,$frame); 
                       $img=newImagick(); 
                       $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=newImagickDraw(); 
                   $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=newImagick(); 
              
         if($this->type=="gif") 
            { 
                $images=$image->coalesceImages(); 
                foreach($imagesas$frame){ 
                    $img=newImagick(); 
                    $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; 
    } 
      
 } 
  
 //添加水印图片 
 publicfunctionadd_watermark($path,$x=0,$y=0) 
 { 
       $watermark=newImagick($path); 
       $draw=newImagickDraw(); 
       $draw->composite($watermark->getImageCompose(),$x,$y,$watermark->getImageWidth(),$watermark->getimageheight(),$watermark); 
    if($this->type=="gif") 
    { 
        $image=$this->image; 
           $canvas=newImagick(); 
        $images=$image->coalesceImages(); 
        foreach($imageas$frame) 
        { 
               $img=newImagick(); 
            $img->readImageBlob($frame); 
               $img->drawImage($draw); 
                 
               $canvas->addImage($img); 
               $canvas->setImageDelay($img->getImageDelay()); 
           } 
           $image->destroy(); 
        $this->image=$canvas; 
    } 
    else
    { 
        $this->image->drawImage($draw); 
    } 
 } 
  
 //添加水印文字 
 publicfunctionadd_text($text,$x=0,$y=0,$angle=0,$style=array()) 
 { 
       $draw=newImagickDraw(); 
       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->imageas$frame) 
        { 
            $frame->annotateImage($draw,$x,$y,$angle,$text); 
        } 
    } 
    else
    { 
        $this->image->annotateImage($draw,$x,$y,$angle,$text); 
    } 
 } 
  
 //保存到指定路径 
 publicfunctionsave_to($path) 
 { 
    if($this->type=="gif") 
    { 
        $this->image->writeImages($path,true); 
    } 
    else
    { 
        $this->image->writeImage($path); 
    } 
 } 
 //输出图像 
 publicfunctionoutput($header=true) 
 { 
    if($header)header("Content-type:".$this->type); 
    echo$this->image->getImagesBlob();   
 } 
  
 publicfunctionget_width() 
 { 
       $size=$this->image->getImagePage();  
       return$size["width"]; 
 } 
  
 publicfunctionget_height() 
 { 
    $size=$this->image->getImagePage();  
       return$size["height"]; 
 } 
 //设置图像类型,默认与源类型一致 
 publicfunctionset_type($type="png") 
 { 
    $this->type=$type; 
       $this->image->setImageFormat($type); 
 } 
 //获取源图像类型 
 publicfunctionget_type() 
 { 
 return$this->type; 
 } 
 
 //当前对象是否为图片 
 publicfunctionis_image() 
 { 
 if($this->image) 
  returntrue; 
 else
  returnfalse; 
 } 
 
 publicfunctionthumbnail($width=100,$height=100,$fit=true){$this->image->thumbnailImage($width,$height,$fit);}//生成缩略图$fit为真时将保持比例并在安全框$widthX$height内生成缩略图片 
 /*
 添加一个边框 
 $width:左右边框宽度 
 $height:上下边框宽度 
 $color:颜色:RGB颜色"rgb(255,0,0)"或16进制颜色"#FF0000"或颜色单词"white"/"red"... 
 */
 publicfunctionborder($width,$height,$color="rgb(220,220,220)") 
 { 
 $color=newImagickPixel(); 
 $color->setColor($color); 
 $this->image->borderImage($color,$width,$height); 
 } 
  
 publicfunctionblur($radius,$sigma){$this->image->blurImage($radius,$sigma);}//模糊 
 publicfunctiongaussian_blur($radius,$sigma){$this->image->gaussianBlurImage($radius,$sigma);}//高斯模糊 
 publicfunctionmotion_blur($radius,$sigma,$angle){$this->image->motionBlurImage($radius,$sigma,$angle);}//运动模糊 
 publicfunctionradial_blur($radius){$this->image->radialBlurImage($radius);}//径向模糊 
 publicfunctionadd_noise($type=null){$this->image->addNoiseImage($type==null?imagick::NOISE_IMPULSE:$type);}//添加噪点 
  
 publicfunctionlevel($black_point,$gamma,$white_point){$this->image->levelImage($black_point,$gamma,$white_point);}//调整色阶 
 publicfunctionmodulate($brightness,$saturation,$hue){$this->image->modulateImage($brightness,$saturation,$hue);}//调整亮度、饱和度、色调 
 publicfunctioncharcoal($radius,$sigma){$this->image->charcoalImage($radius,$sigma);}//素描 
 publicfunctionoil_paint($radius){$this->image->oilPaintImage($radius);}//油画效果 
  
 publicfunctionflop(){$this->image->flopImage();}//水平翻转 
 publicfunctionflip(){$this->image->flipImage();}//垂直翻转 
}

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