Home > Backend Development > PHP Tutorial > php_imagick realizes picture cutting, rotation, sharpening, color reduction or adding special effects_PHP tutorial

php_imagick realizes picture cutting, rotation, sharpening, color reduction or adding special effects_PHP tutorial

WBOY
Release: 2016-07-13 10:46:27
Original
1072 people have browsed it

A PHP extension that allows PHP to call the ImageMagick function. Using this extension allows PHP to have the same functionality as ImageMagick.


ImageMagick is a powerful, stable and free toolset and development package that can be used to read, write and process image files in more than 185 basic formats, including popular TIFF, JPEG, GIF, PNG, PDF and PhotoCD formats. . Using ImageMagick, you can dynamically generate images according to the needs of web applications. You can also change the size, rotate, sharpen, reduce color or add special effects to an image (or a group of images), and save the results in the same format. or save in other formats.


php_imagick is an extension package for PHP image processing. It can complete operations such as changing the size, rotating, sharpening, subtracting colors or adding special effects to images.
1. Install Imagick extension under windows:


1. Download ImageMagick and install

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

2. Download php_imagick.dll

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

If you are using thread-safe php, please download
http://valokuva.org/outside-blog-content/imagick- windows-builds/php53/imagick-2.3.0-dev/vc9_zts/php_imagick.dll

3. Settings
Add
in php.ini extension=php_imagick.dll, restart web server


2. Install Imagick extension under Linux:


1.yum install ImageMagick


yum install ImageMagick ImageMagick-devel

2. Test whether the installation is successful

convert -version

3. Install imagick extension

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. Edit the php.ini file and add the following code at the end of the file

extension=imagick.so

5. Restart apache server

service httpd restart


3. Case
1. Border processing

The code is as follows Copy code
//by www.bKjia.c0m
 代码如下 复制代码
//by www.bKjia.c0m
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;
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;

Let’s look at a simple example first

 代码如下 复制代码
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;
?>

php_imagick program example

 代码如下 复制代码

$images = new Imagick(glob('images/*.JPG'));
foreach($images as $image) {
// Providing 0 forces thumbnailImage to maintain aspect ratio
$image->thumbnailImage(1024,0);
}
$images->writeImages();
?>

1. Create a thumbnail and display it
The code is as follows Copy code
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. Create a thumbnail in a directory and save it
The code is as follows Copy code
$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动画图片

 代码如下 复制代码
 代码如下 复制代码

/* 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);
?>

/* 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);
?>

现在我们进入正题吧,

例1

裁切/生成缩略图/添加水印, 自动检测和处理 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');

 代码如下 复制代码
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 

 代码如下 复制代码

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);
     }
 }

/*
* Change image size
$fit: adapt to size
'force': Force the image to be $width X $height size
'scale': Scale the image proportionally within the safe box $width X $height, and the output scaled image size is not exactly equal to $width 'scale_fill': Scale the image proportionally within the safety box $width , transparency) transparency (0 opaque-127 fully transparent))
Others: Smart mode can scale the image and load the middle part of the image $width X $height pixel size
When $fit = 'force','scale','scale_fill': Output the complete image
When $fit = image orientation value, output part of the image at the specified position
The corresponding relationship between letters and images is as follows:

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);} // Add noise

public function level($black_point, $gamma, $white_point){$this->image->levelImage($black_point, $gamma, $white_point);} // Adjust the color level
public function modulate($brightness, $saturation, $hue){$this->image->modulateImage($brightness, $saturation, $hue);} // Adjust brightness, saturation, hue

public function charcoal($radius, $sigma){$this->image->charcoalImage($radius, $sigma);} // Sketch
public function oil_paint($radius){$this->image->oilPaintImage($radius);} // Oil painting effect

public function flop(){$this->image->flopImage();} // Horizontal flip
public function flip(){$this->image->flipImage();} // Vertical flip

}

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/632949.htmlTechArticleA PHP extension that allows PHP to call the ImageMagick function. Using this extension allows PHP to have the same functionality as ImageMagick. ImageMagick is a powerful, stable and free tool...
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template