加入收藏 | 设为首页 | 会员中心 | 我要投稿 阳江站长网 (https://www.0662zz.cn/)- 办公协同、云通信、区块链、物联平台、高性能计算!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP Imagick完美实现图片裁切、生成缩略图、添加水印

发布时间:2022-07-18 09:41:15 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了PHP Imagick完美实现图片裁切、生成缩略图、添加水印的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 本文实例讲解了PHP使用Imagick 裁切、生成缩略图、添加水印自动检测和处理,支持gif,分享给大家供大家参考,具体内
  这篇文章主要介绍了PHP Imagick完美实现图片裁切、生成缩略图、添加水印的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
 
  本文实例讲解了PHP使用Imagick 裁切、生成缩略图、添加水印自动检测和处理,支持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   
  /*  
  @版本日期: 版本日期: 2012年1月18日  
  @著作权所有: 1024 intelligence ( <a href="http://www.1024i.com" target="_blank">http://www.1024i.com</a> )  
  获得使用本类库的许可, 您必须保留著作权声明信息.  
  报告漏洞,意见或建议, 请联系 Lou Barnes(iua1024@gmail.com)  
  */  
     
  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);   
  }   
  }   

(编辑:阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读