当前位置:首页 > PHP教程 > php图像处理 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-10 15:31:10 浏览: 评论:0 

这篇文章主要介绍了PHP Imagick完美实现图片裁切、生成缩略图、添加水印的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

本文实例讲解了PHP使用Imagick 裁切、生成缩略图、添加水印自动检测和处理,支持gif,分享给大家供大家参考,具体内容如下

调用方式:

  1. include 'imagick.class.php';   
  2. $image = new lib_image_imagick();   
  3. $image->open('a.gif');   
  4. $image->resize_to(100, 100, 'scale_fill');   
  5. $image->add_text('1024i.com', 10, 20);   
  6. $image->add_watermark('1024i.gif', 10, 50);   
  7. $image->save_to('x.gif');  

imagick.class.php

  1. <?php   
  2. /*  
  3. @版本日期: 版本日期: 2012年1月18日  
  4. @著作权所有: 1024 intelligence ( <a href="http://www.1024i.com" target="_blank">http://www.1024i.com</a> )  
  5. 获得使用本类库的许可, 您必须保留著作权声明信息.  
  6. 报告漏洞,意见或建议, 请联系 Lou Barnes(iua1024@gmail.com)  
  7. */  
  8.    
  9. class lib_image_imagick   
  10. {   
  11. private $image = null;   
  12. private $type = null;   
  13. // 构造函数   
  14. public function __construct(){}   
  15.    
  16. // 析构函数   
  17. public function __destruct()   
  18. {   
  19. if($this->image!==null) $this->image->destroy();   
  20. }   
  21. // 载入图像   
  22. public function open($path)   
  23. {   
  24. $this->image = new Imagick( $path );   
  25. if($this->image)   
  26. {   
  27. $this->type = strtolower($this->image->getImageFormat());   
  28. }   
  29. return $this->image;   
  30. }   
  31.    
  32. public function crop($x=0, $y=0, $width=null, $height=null)   
  33. {   
  34. if($width==null) $width = $this->image->getImageWidth()-$x;   
  35. if($height==null) $height = $this->image->getImageHeight()-$y;   
  36. if($width<=0 || $height<=0) return;   
  37. if($this->type=='gif')   
  38. {   
  39. $image = $this->image;   
  40. $canvas = new Imagick();   
  41. $images = $image->coalesceImages();   
  42. foreach($images as $frame){   
  43. $img = new Imagick();   
  44. $img->readImageBlob($frame);   
  45. $img->cropImage($width$height$x$y);   
  46. $canvas->addImage( $img );   
  47. $canvas->setImageDelay( $img->getImageDelay() );   
  48. $canvas->setImagePage($width$height, 0, 0);   
  49. }   
  50. $image->destroy();   
  51. $this->image = $canvas;   
  52. }   
  53. else  
  54. {   
  55. $this->image->cropImage($width$height$x$y);   
  56. }   
  57. }   
  58. /*  
  59. * 更改图像大小  
  60. $fit: 适应大小方式  
  61. 'force': 把图片强制变形成 $width X $height 大小  
  62. 'scale': 按比例在安全框 $width X $height 内缩放图片, 输出缩放后图像大小 不完全等于 $width X $height  
  63. 'scale_fill': 按比例在安全框 $width X $height 内缩放图片,安全框内没有像素的地方填充色, 使用此参数时可设置背景填充色 $bg_color = array(255,255,255)(红,绿,蓝, 透明度) 透明度(0不透明-127完全透明))  
  64. 其它: 智能模能 缩放图像并载取图像的中间部分 $width X $height 像素大小  
  65. $fit = 'force','scale','scale_fill' 时: 输出完整图像  
  66. $fit = 图像方位值 时, 输出指定位置部分图像  
  67. 字母与图像的对应关系如下:  
  68. north_west north north_east  
  69. west center east  
  70. south_west south south_east  
  71. */  
  72. public function resize_to($width = 100, $height = 100, $fit = 'center'$fill_color = array(255,255,255,0) )   
  73. {   
  74. switch($fit)   
  75. {   
  76. case 'force':   
  77. if($this->type=='gif')   
  78. {   
  79. $image = $this->image;   
  80. $canvas = new Imagick();   
  81. $images = $image->coalesceImages();   
  82. foreach($images as $frame){   
  83. $img = new Imagick();   
  84. $img->readImageBlob($frame);   
  85. $img->thumbnailImage( $width$height, false );   
  86. $canvas->addImage( $img );   
  87. $canvas->setImageDelay( $img->getImageDelay() );   
  88. }   
  89. $image->destroy();   
  90. $this->image = $canvas;   
  91. }   
  92. else  
  93. {   
  94. $this->image->thumbnailImage( $width$height, false );   
  95. }   
  96. break;   
  97. case 'scale':   
  98. if($this->type=='gif')   
  99. {   
  100. $image = $this->image;   
  101. $images = $image->coalesceImages();   
  102. $canvas = new Imagick();   
  103. foreach($images as $frame){   
  104. $img = new Imagick();   
  105. $img->readImageBlob($frame);   
  106. $img->thumbnailImage( $width$height, true );   
  107. $canvas->addImage( $img );   
  108. $canvas->setImageDelay( $img->getImageDelay() );   
  109. }   
  110. $image->destroy();   
  111. $this->image = $canvas;   
  112. }   
  113. else  
  114. {   
  115. $this->image->thumbnailImage( $width$height, true );   
  116. }   
  117. break;   
  118. case 'scale_fill':   
  119. $size = $this->image->getImagePage();   
  120. $src_width = $size['width'];   
  121. $src_height = $size['height'];   
  122. $x = 0;   
  123. $y = 0;   
  124. $dst_width = $width;   
  125. $dst_height = $height;   
  126. if($src_width*$height > $src_height*$width)   
  127. {   
  128. $dst_height = intval($width*$src_height/$src_width);   
  129. $y = intval( ($height-$dst_height)/2 );   
  130. }   
  131. else  
  132. {   
  133. $dst_width = intval($height*$src_width/$src_height);   
  134. $x = intval( ($width-$dst_width)/2 );   
  135. }   
  136. $image = $this->image;   
  137. $canvas = new Imagick();   
  138. $color = 'rgba('.$fill_color[0].','.$fill_color[1].','.$fill_color[2].','.$fill_color[3].')';   
  139. if($this->type=='gif')   
  140. {   
  141. $images = $image->coalesceImages();   
  142. foreach($images as $frame)   
  143. {   
  144. $frame->thumbnailImage( $width$height, true );   
  145. $draw = new ImagickDraw();   
  146. $draw->composite($frame->getImageCompose(), $x$y$dst_width$dst_height$frame);   
  147. $img = new Imagick();   
  148. $img->newImage($width$height$color'gif');   
  149. $img->drawImage($draw);   
  150. $canvas->addImage( $img );   
  151. $canvas->setImageDelay( $img->getImageDelay() );   
  152. $canvas->setImagePage($width$height, 0, 0);   
  153. }   
  154. }   
  155. else  
  156. {   
  157. $image->thumbnailImage( $width$height, true );   
  158. $draw = new ImagickDraw();   
  159. $draw->composite($image->getImageCompose(), $x$y$dst_width$dst_height$image);   
  160. $canvas->newImage($width$height$color$this->get_type() );   
  161. $canvas->drawImage($draw);   
  162. $canvas->setImagePage($width$height, 0, 0);   
  163. }   
  164. $image->destroy();   
  165. $this->image = $canvas;   
  166. break;   
  167. default:   
  168. $size = $this->image->getImagePage();   
  169. $src_width = $size['width'];   
  170. $src_height = $size['height'];   
  171. $crop_x = 0;   
  172. $crop_y = 0;   
  173. $crop_w = $src_width;   
  174. $crop_h = $src_height;   
  175. if($src_width*$height > $src_height*$width)   
  176. {   
  177. $crop_w = intval($src_height*$width/$height);   
  178. }   
  179. else  
  180. {   
  181. $crop_h = intval($src_width*$height/$width);   
  182. }   
  183. switch($fit)   
  184. {   
  185. case 'north_west':   
  186. $crop_x = 0;   
  187. $crop_y = 0;   
  188. break;   
  189. case 'north':   
  190. $crop_x = intval( ($src_width-$crop_w)/2 );   
  191. $crop_y = 0;   
  192. break;   
  193. case 'north_east':   
  194. $crop_x = $src_width-$crop_w;   
  195. $crop_y = 0;   
  196. break;   
  197. case 'west':   
  198. $crop_x = 0;   
  199. $crop_y = intval( ($src_height-$crop_h)/2 );   
  200. break;   
  201. case 'center':   
  202. $crop_x = intval( ($src_width-$crop_w)/2 );   
  203. $crop_y = intval( ($src_height-$crop_h)/2 );   
  204. break;   
  205. case 'east':   
  206. $crop_x = $src_width-$crop_w;   
  207. $crop_y = intval( ($src_height-$crop_h)/2 );   
  208. break;   
  209. case 'south_west':   
  210. $crop_x = 0;   
  211. $crop_y = $src_height-$crop_h;   
  212. break;   
  213. case 'south':   
  214. $crop_x = intval( ($src_width-$crop_w)/2 );   
  215. $crop_y = $src_height-$crop_h;   
  216. break;   
  217. case 'south_east':   
  218. $crop_x = $src_width-$crop_w;   
  219. $crop_y = $src_height-$crop_h;   
  220. break;   
  221. default:   
  222. $crop_x = intval( ($src_width-$crop_w)/2 );   
  223. $crop_y = intval( ($src_height-$crop_h)/2 );   
  224. }   
  225. $image = $this->image;   
  226. $canvas = new Imagick();   
  227. if($this->type=='gif')   
  228. {   
  229. $images = $image->coalesceImages();   
  230. foreach($images as $frame){   
  231. $img = new Imagick();   
  232. $img->readImageBlob($frame);   
  233. $img->cropImage($crop_w$crop_h$crop_x$crop_y);   
  234. $img->thumbnailImage( $width$height, true );   
  235. $canvas->addImage( $img );   
  236. $canvas->setImageDelay( $img->getImageDelay() );   
  237. $canvas->setImagePage($width$height, 0, 0);   
  238. }   
  239. }   
  240. else  
  241. {   
  242. $image->cropImage($crop_w$crop_h$crop_x$crop_y);   
  243. $image->thumbnailImage( $width$height, true );   
  244. $canvas->addImage( $image );   
  245. $canvas->setImagePage($width$height, 0, 0);   
  246. }   
  247. $image->destroy();   
  248. $this->image = $canvas;   
  249. }   
  250. }   
  251.    
  252. // 添加水印图片   
  253. public function add_watermark($path$x = 0, $y = 0)   
  254. {   
  255. $watermark = new Imagick($path);   
  256. $draw = new ImagickDraw();   
  257. $draw->composite($watermark->getImageCompose(), $x$y$watermark->getImageWidth(), $watermark->getimageheight(), $watermark);   
  258. if($this->type=='gif')   
  259. {   
  260. $image = $this->image;   
  261. $canvas = new Imagick();   
  262. $images = $image->coalesceImages();   
  263. foreach($image as $frame)   
  264. {   
  265. $img = new Imagick();   
  266. $img->readImageBlob($frame);   
  267. $img->drawImage($draw);   
  268. $canvas->addImage( $img );   
  269. $canvas->setImageDelay( $img->getImageDelay() );   
  270. }   
  271. $image->destroy();   
  272. $this->image = $canvas;   
  273. }   
  274. else  
  275. {   
  276. $this->image->drawImage($draw);   
  277. }   
  278. }   
  279.    
  280. // 添加水印文字   
  281. public function add_text($text$x = 0 , $y = 0, $angle=0, $style=array())   
  282. {   
  283. $draw = new ImagickDraw();   
  284. if(isset($style['font'])) $draw->setFont($style['font']);   
  285. if(isset($style['font_size'])) $draw->setFontSize($style['font_size']);   
  286. if(isset($style['fill_color'])) $draw->setFillColor($style['fill_color']);   
  287. if(isset($style['under_color'])) $draw->setTextUnderColor($style['under_color']);   
  288. if($this->type=='gif')   
  289. {   
  290. foreach($this->image as $frame)   
  291. {   
  292. $frame->annotateImage($draw$x$y$angle$text);   
  293. }   
  294. }   
  295. else  
  296. {   
  297. $this->image->annotateImage($draw$x$y$angle$text);   
  298. }   
  299. }   
  300.    
  301. // 保存到指定路径   
  302. public function save_to( $path )   
  303. {   
  304. if($this->type=='gif')   
  305. {   
  306. $this->image->writeImages($path, true);   
  307. }   
  308. else  
  309. {   
  310. $this->image->writeImage($path);   
  311. }   
  312. }   
  313. // 输出图像   
  314. public function output($header = true)   
  315. {   
  316. if($header) header('Content-type: '.$this->type);   
  317. echo $this->image->getImagesBlob();   
  318. }   
  319.    
  320. public function get_width()   
  321. {   
  322. $size = $this->image->getImagePage();   
  323. return $size['width'];   
  324. }   
  325. public function get_height()   
  326. {   
  327. $size = $this->image->getImagePage();   
  328. return $size['height'];   
  329. }   
  330. // 设置图像类型, 默认与源类型一致   
  331. public function set_type( $type='png' )   
  332. {   
  333. $this->type = $type;   
  334. $this->image->setImageFormat( $type );   
  335. }   
  336. // 获取源图像类型   
  337. public function get_type()   
  338. {   
  339. return $this->type;   
  340. }   
  341.    
  342. // 当前对象是否为图片   
  343. public function is_image()   
  344. {   
  345. if$this->image )   
  346. return true;   
  347. else  
  348. return false;   
  349. }   
  350.    
  351. public function thumbnail($width = 100, $height = 100, $fit = true){ $this->image->thumbnailImage( $width$height$fit );} // 生成缩略图 $fit为真时将保持比例并在安全框 $width X $height 内生成缩略图片   
  352. /*  
  353. 添加一个边框  
  354. $width: 左右边框宽度  
  355. $height: 上下边框宽度  
  356. $color: 颜色: RGB 颜色 'rgb(255,0,0)' 或 16进制颜色 '#FF0000' 或颜色单词 'white'/'red'...  
  357. */  
  358. public function border($width$height$color='rgb(220, 220, 220)')   
  359. {   
  360. $color=new ImagickPixel();   
  361. $color->setColor($color);   
  362. $this->image->borderImage($color$width$height);   
  363. }   
  364. public function blur($radius$sigma){$this->image->blurImage($radius$sigma);} // 模糊   
  365. public function gaussian_blur($radius$sigma){$this->image->gaussianBlurImage($radius$sigma);} // 高斯模糊   
  366. public function motion_blur($radius$sigma$angle){$this->image->motionBlurImage($radius$sigma$angle);} // 运动模糊   
  367. public function radial_blur($radius){$this->image->radialBlurImage($radius);} // 径向模糊   
  368. public function add_noise($type=null){$this->image->addNoiseImage($type==null?imagick::NOISE_IMPULSE:$type);} // 添加噪点   
  369. public function level($black_point$gamma$white_point){$this->image->levelImage($black_point$gamma$white_point);} // 调整色阶   
  370. public function modulate($brightness$saturation$hue){$this->image->modulateImage($brightness$saturation$hue);} // 调整亮度、饱和度、色调   
  371. public function charcoal($radius$sigma){$this->image->charcoalImage($radius$sigma);} // 素描   
  372. public function oil_paint($radius){$this->image->oilPaintImage($radius);} // 油画效果   
  373. public function flop(){$this->image->flopImage();} // 水平翻转   
  374. public function flip(){$this->image->flipImage();} // 垂直翻转   
  375. }

Tags: Imagick PHP图片裁切

分享到: