Table of Contents
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法,
Home php教程 php手册 php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法,

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

Jun 13, 2016 am 09:18 AM
imagick php picture method

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

本文实例讲述了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.创建一个缩略图并显示出来

复制代码 代码如下:

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.创建一个目录下的缩略图,并保存

复制代码 代码如下:

$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); 
?>


现在我们进入正题吧,

示例:

裁切/生成缩略图/添加水印, 自动检测和处理 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       
     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程序设计有所帮助。

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

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
1 months ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
1 months ago By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1677
14
PHP Tutorial
1280
29
C# Tutorial
1257
24
The Continued Use of PHP: Reasons for Its Endurance The Continued Use of PHP: Reasons for Its Endurance Apr 19, 2025 am 12:23 AM

What’s still popular is the ease of use, flexibility and a strong ecosystem. 1) Ease of use and simple syntax make it the first choice for beginners. 2) Closely integrated with web development, excellent interaction with HTTP requests and database. 3) The huge ecosystem provides a wealth of tools and libraries. 4) Active community and open source nature adapts them to new needs and technology trends.

What happens if session_start() is called multiple times? What happens if session_start() is called multiple times? Apr 25, 2025 am 12:06 AM

Multiple calls to session_start() will result in warning messages and possible data overwrites. 1) PHP will issue a warning, prompting that the session has been started. 2) It may cause unexpected overwriting of session data. 3) Use session_status() to check the session status to avoid repeated calls.

The Compatibility of IIS and PHP: A Deep Dive The Compatibility of IIS and PHP: A Deep Dive Apr 22, 2025 am 12:01 AM

IIS and PHP are compatible and are implemented through FastCGI. 1.IIS forwards the .php file request to the FastCGI module through the configuration file. 2. The FastCGI module starts the PHP process to process requests to improve performance and stability. 3. In actual applications, you need to pay attention to configuration details, error debugging and performance optimization.

What is the significance of the session_start() function? What is the significance of the session_start() function? May 03, 2025 am 12:18 AM

session_start()iscrucialinPHPformanagingusersessions.1)Itinitiatesanewsessionifnoneexists,2)resumesanexistingsession,and3)setsasessioncookieforcontinuityacrossrequests,enablingapplicationslikeuserauthenticationandpersonalizedcontent.

Composer: Aiding PHP Development Through AI Composer: Aiding PHP Development Through AI Apr 29, 2025 am 12:27 AM

AI can help optimize the use of Composer. Specific methods include: 1. Dependency management optimization: AI analyzes dependencies, recommends the best version combination, and reduces conflicts. 2. Automated code generation: AI generates composer.json files that conform to best practices. 3. Improve code quality: AI detects potential problems, provides optimization suggestions, and improves code quality. These methods are implemented through machine learning and natural language processing technologies to help developers improve efficiency and code quality.

Using Laravel: Streamlining Web Development with PHP Using Laravel: Streamlining Web Development with PHP Apr 19, 2025 am 12:18 AM

Laravel optimizes the web development process including: 1. Use the routing system to manage the URL structure; 2. Use the Blade template engine to simplify view development; 3. Handle time-consuming tasks through queues; 4. Use EloquentORM to simplify database operations; 5. Follow best practices to improve code quality and maintainability.

PHP and IIS: Making Them Work Together PHP and IIS: Making Them Work Together Apr 21, 2025 am 12:06 AM

Configuring and running PHP on IIS requires the following steps: 1) Download and install PHP, 2) Configuring IIS and adding FastCGI module, 3) Create and set up an application pool, 4) Create a website and bind to an application pool. Through these steps, you can easily deploy PHP applications on your Windows server and improve application stability and efficiency by configuring scaling and optimizing performance.

H5: Key Improvements in HTML5 H5: Key Improvements in HTML5 Apr 28, 2025 am 12:26 AM

HTML5 brings five key improvements: 1. Semantic tags improve code clarity and SEO effects; 2. Multimedia support simplifies video and audio embedding; 3. Form enhancement simplifies verification; 4. Offline and local storage improves user experience; 5. Canvas and graphics functions enhance the visualization of web pages.

See all articles