Maison  >  Article  >  développement back-end  >  php 缩略图生成类(支持imagemagick与gd库)

php 缩略图生成类(支持imagemagick与gd库)

WBOY
WBOYoriginal
2016-07-25 08:55:26802parcourir
  1. /** 缩略图生成类,支持imagemagick及gd库两种处理

  2. * Date: 2013-07-15
  3. * Author: fdipzone
  4. * Ver: 1.2
  5. * edit: bbs.it-home.org
  6. * Func:
  7. * public set_config: 设置参数
  8. * public create_thumb: 生成缩略图
  9. * private fit: 缩略图片
  10. * private crop: 裁剪图片
  11. * private gd_fit: GD库缩略图片
  12. * private gd_crop: GD库裁剪图片
  13. * private get_size: 获取要转换的size
  14. * private get_crop_offset: 获取裁图的偏移量
  15. * private add_watermark: 添加水印
  16. * private check_handler: 判断处理程序是否已安装
  17. * private create_dirs: 创建目录
  18. * private exists: 判断参数是否存在
  19. * private to_log: 记录log
  20. * private hex2rgb: hex颜色转rgb颜色
  21. * private get_file_ext: 获取图片类型
  22. *
  23. * ver: 1.1 增加GD库处理
  24. * ver: 1.2 增加width,height错误参数处理
  25. * 增加当图片colorspace不为RGB时作转RGB处理
  26. * 修正使用crop保存为gif时出现透明无效区域问题,使用+repage参数,删除透明无效区域即可
  27. *
  28. * tips:建议使用imagemagick
  29. * GD库不支持透明度水印,如果必须使用透明水印,请将水印图片做成有透明度。
  30. * GD库输出gif如加透明水印,会有问题。
  31. */
  32. class PicThumb{ // class start
  33. private $_log = null; // log file
  34. private $_handler = null; // 进行图片处理的程序,imagemagick/gd库
  35. private $_type = 'fit'; // fit or crop
  36. private $_source = null; // 原图路径
  37. private $_dest = null; // 缩略图路径
  38. private $_watermark = null; // 水印图片
  39. private $_opacity = 75; // 水印圖片透明度,gd库不支持
  40. private $_gravity = 'SouthEast'; // 水印摆放位置 NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast
  41. private $_geometry = '+10+10'; // 水印定位,gd库不支持
  42. private $_croppos = 'TL'; // 截图的位置 TL TM TR ML MM MR BL BM BR
  43. private $_bgcolor = null; // 填充的背景色
  44. private $_quality = 90; // 生成的图片质量
  45. private $_width = null; // 指定区域宽度
  46. private $_height = null; // 指定区域高度
  47. // 初始化
  48. public function __construct($logfile=''){
  49. if($logfile!=''){
  50. $this->_log = $logfile;
  51. }
  52. }
  53. // 设置参数
  54. public function set_config($param=array()){
  55. $this->_handler = $this->exists($param, 'handler')? strtolower($param['handler']) : null;
  56. $this->_type = $this->exists($param, 'type')? strtolower($param['type']) : 'fit';
  57. $this->_watermark = $this->exists($param, 'watermark')? $param['watermark'] : null;
  58. $this->_opacity = $this->exists($param, 'opacity')? $param['opacity'] : 75;
  59. $this->_gravity = $this->exists($param, 'gravity')? $param['gravity'] : 'SouthEast';
  60. $this->_geometry = $this->exists($param, 'geometry')? $param['geometry'] : '+10+10';
  61. $this->_croppos = $this->exists($param, 'croppos')? $param['croppos'] : 'TL';
  62. $this->_bgcolor = $this->exists($param, 'bgcolor')? $param['bgcolor'] : null;
  63. $this->_quality = $this->exists($param, 'quality')? $param['quality'] : 90;
  64. $this->_width = $this->exists($param, 'width')? $param['width'] : null;
  65. $this->_height = $this->exists($param, 'height')? $param['height'] : null;
  66. }
  67. /** 创建缩略图
  68. * @param String $source 原图
  69. * @param String $dest 目标图
  70. * @return boolean
  71. */
  72. public function create_thumb($source, $dest){
  73. // 检查使用的handler是否已安装
  74. if(!$this->check_handler()){
  75. $this->to_log('handler not installed');
  76. return false;
  77. }
  78. // 判断区域宽高是否正确
  79. if(!is_numeric($this->_width) || !is_numeric($this->_height) || $this->_width_height $this->to_log('width or height invalid');
  80. return false;
  81. }
  82. // 判断源文件是否存在
  83. if(!file_exists($source)){
  84. $this->to_log($source.' not exists');
  85. return false;
  86. }
  87. // 创建目标文件路径
  88. if(!$this->create_dirs($dest)){
  89. $this->to_log(dirname($dest).' create fail');
  90. return false;
  91. }
  92. $this->_source = $source; // 源文件
  93. $this->_dest = $dest; // 目标文件
  94. // 处理图片
  95. switch($this->_type){
  96. case 'fit':
  97. if($this->_handler=='imagemagick'){
  98. return $this->fit();
  99. }else{
  100. return $this->gd_fit();
  101. }
  102. break;
  103. case 'crop':
  104. if($this->_handler=='imagemagick'){
  105. return $this->crop();
  106. }else{
  107. return $this->gd_crop();
  108. }
  109. break;
  110. default:
  111. $this->to_log($this->_type.' not fit and crop');
  112. return false;
  113. }
  114. }
  115. /** 按比例压缩或拉伸图片
  116. * @return boolean
  117. */
  118. private function fit(){
  119. // 判断是否填充背景
  120. $bgcolor = ($this->_bgcolor!=null)?
  121. sprintf(" -background '%s' -gravity center -extent '%sx%s' ", $this->_bgcolor, $this->_width, $this->_height) : "";
  122. // 判断是否要转为RGB
  123. $source_info = getimagesize($this->_source);
  124. $colorspace = (!isset($source_info['channels']) || $source_info['channels']!=3)? ' -colorspace RGB ' : '';
  125. // 命令行
  126. $cmd = sprintf("convert -resize '%sx%s' '%s' %s -quality %s %s '%s'", $this->_width, $this->_height, $this->_source, $bgcolor, $this->_quality, $colorspace, $this->_dest);
  127. // 记录执行的命令
  128. $this->to_log($cmd);
  129. // 执行命令
  130. exec($cmd);
  131. // 添加水印
  132. $this->add_watermark($this->_dest);
  133. return is_file($this->_dest)? true : false;
  134. }
  135. /** 裁剪图片
  136. * @return boolean
  137. */
  138. private function crop(){
  139. // 获取生成的图片尺寸
  140. list($pic_w, $pic_h) = $this->get_size();
  141. // 获取截图的偏移量
  142. list($offset_w, $offset_h) = $this->get_crop_offset($pic_w, $pic_h);
  143. // 判断是否要转为RGB
  144. $source_info = getimagesize($this->_source);
  145. $colorspace = (!isset($source_info['channels']) || $source_info['channels']!=3)? ' -colorspace RGB ' : '';
  146. // 命令行
  147. $cmd = sprintf("convert -resize '%sx%s' '%s' -quality %s %s -crop %sx%s+%s+%s +repage '%s'", $pic_w, $pic_h, $this->_source, $this->_quality, $colorspace, $this->_width, $this->_height, $offset_w, $offset_h, $this->_dest);
  148. // 记录执行的命令
  149. $this->to_log($cmd);
  150. // 执行命令
  151. exec($cmd);
  152. // 添加水印
  153. $this->add_watermark($this->_dest);
  154. return is_file($this->_dest)? true : false;
  155. }
  156. /** GD库按比例压缩或拉伸图片
  157. * @return boolean
  158. */
  159. private function gd_fit(){
  160. // 获取生成的图片尺寸
  161. list($pic_w, $pic_h) = $this->get_size();
  162. list($owidth, $oheight, $otype) = getimagesize($this->_source);
  163. switch($otype){
  164. case 1: $source_img = imagecreatefromgif($this->_source); break;
  165. case 2: $source_img = imagecreatefromjpeg($this->_source); break;
  166. case 3: $source_img = imagecreatefrompng($this->_source); break;
  167. default: return false;
  168. }
  169. // 按比例缩略/拉伸图片
  170. $new_img = imagecreatetruecolor($pic_w, $pic_h);
  171. imagecopyresampled($new_img, $source_img, 0, 0, 0, 0, $pic_w, $pic_h, $owidth, $oheight);
  172. // 判断是否填充背景
  173. if($this->_bgcolor!=null){
  174. $bg_img = imagecreatetruecolor($this->_width, $this->_height);
  175. $rgb = $this->hex2rgb($this->_bgcolor);
  176. $bgcolor =imagecolorallocate($bg_img, $rgb['r'], $rgb['g'], $rgb['b']);
  177. imagefill($bg_img, 0, 0, $bgcolor);
  178. imagecopy($bg_img, $new_img, (int)(($this->_width-$pic_w)/2), (int)(($this->_height-$pic_h)/2), 0, 0, $pic_w, $pic_h);
  179. $new_img = $bg_img;
  180. }
  181. // 获取目标图片的类型
  182. $dest_ext = $this->get_file_ext($this->_dest);
  183. // 生成图片
  184. switch($dest_ext){
  185. case 1: imagegif($new_img, $this->_dest, $this->_quality); break;
  186. case 2: imagejpeg($new_img, $this->_dest, $this->_quality); break;
  187. case 3: imagepng($new_img, $this->_dest, (int)(($this->_quality-1)/10)); break;
  188. }
  189. if(isset($source_img)){
  190. imagedestroy($source_img);
  191. }
  192. if(isset($new_img)){
  193. imagedestroy($new_img);
  194. }
  195. // 添加水印
  196. $this->add_watermark($this->_dest);
  197. return is_file($this->_dest)? true : false;
  198. }
  199. /** GD库裁剪图片
  200. * @return boolean
  201. */
  202. private function gd_crop(){
  203. // 获取生成的图片尺寸
  204. list($pic_w, $pic_h) = $this->get_size();
  205. // 获取截图的偏移量
  206. list($offset_w, $offset_h) = $this->get_crop_offset($pic_w, $pic_h);
  207. list($owidth, $oheight, $otype) = getimagesize($this->_source);
  208. switch($otype){
  209. case 1: $source_img = imagecreatefromgif($this->_source); break;
  210. case 2: $source_img = imagecreatefromjpeg($this->_source); break;
  211. case 3: $source_img = imagecreatefrompng($this->_source); break;
  212. default: return false;
  213. }
  214. // 按比例缩略/拉伸图片
  215. $tmp_img = imagecreatetruecolor($pic_w, $pic_h);
  216. imagecopyresampled($tmp_img, $source_img, 0, 0, 0, 0, $pic_w, $pic_h, $owidth, $oheight);
  217. // 裁剪图片
  218. $new_img = imagecreatetruecolor($this->_width, $this->_height);
  219. imagecopyresampled($new_img, $tmp_img, 0, 0, $offset_w, $offset_h, $this->_width, $this->_height, $this->_width, $this->_height);
  220. // 获取目标图片的类型
  221. $dest_ext = $this->get_file_ext($this->_dest);
  222. // 生成图片
  223. switch($dest_ext){
  224. case 1: imagegif($new_img, $this->_dest, $this->_quality); break;
  225. case 2: imagejpeg($new_img, $this->_dest, $this->_quality); break;
  226. case 3: imagepng($new_img, $this->_dest, (int)(($this->_quality-1)/10)); break;
  227. }
  228. if(isset($source_img)){
  229. imagedestroy($source_img);
  230. }
  231. if(isset($tmp_img)){
  232. imagedestroy($tmp_img);
  233. }
  234. if(isset($new_img)){
  235. imagedestroy($new_img);
  236. }
  237. // 添加水印
  238. $this->add_watermark($this->_dest);
  239. return is_file($this->_dest)? true : false;
  240. }
  241. /** 获取目标图生成的size
  242. * @return Array $width, $height
  243. */
  244. private function get_size(){
  245. list($owidth, $oheight) = getimagesize($this->_source);
  246. $width = (int)($this->_width);
  247. $height = (int)($this->_height);
  248. switch($this->_type){
  249. case 'fit':
  250. $pic_w = $width;
  251. $pic_h = (int)($pic_w*$oheight/$owidth);
  252. if($pic_h>$height){
  253. $pic_h = $height;
  254. $pic_w = (int)($pic_h*$owidth/$oheight);
  255. }
  256. break;
  257. case 'crop':
  258. if($owidth>$oheight){
  259. $pic_h = $height;
  260. $pic_w = (int)($pic_h*$owidth/$oheight);
  261. }else{
  262. $pic_w = $width;
  263. $pic_h = (int)($pic_w*$oheight/$owidth);
  264. }
  265. break;
  266. }
  267. return array($pic_w, $pic_h);
  268. }
  269. /** 获取截图的偏移量
  270. * @param int $pic_w 图宽度
  271. * @param int $pic_h 图高度
  272. * @return Array $offset_w, $offset_h
  273. */
  274. private function get_crop_offset($pic_w, $pic_h){
  275. $offset_w = 0;
  276. $offset_h = 0;
  277. switch(strtoupper($this->_croppos)){
  278. case 'TL':
  279. $offset_w = 0;
  280. $offset_h = 0;
  281. break;
  282. case 'TM':
  283. $offset_w = (int)(($pic_w-$this->_width)/2);
  284. $offset_h = 0;
  285. break;
  286. case 'TR':
  287. $offset_w = (int)($pic_w-$this->_width);
  288. $offset_h = 0;
  289. break;
  290. case 'ML':
  291. $offset_w = 0;
  292. $offset_h = (int)(($pic_h-$this->_height)/2);
  293. break;
  294. case 'MM':
  295. $offset_w = (int)(($pic_w-$this->_width)/2);
  296. $offset_h = (int)(($pic_h-$this->_height)/2);
  297. break;
  298. case 'MR':
  299. $offset_w = (int)($pic_w-$this->_width);
  300. $offset_h = (int)(($pic_h-$this->_height)/2);
  301. break;
  302. case 'BL':
  303. $offset_w = 0;
  304. $offset_h = (int)($pic_h-$this->_height);
  305. break;
  306. case 'BM':
  307. $offset_w = (int)(($pic_w-$this->_width)/2);
  308. $offset_h = (int)($pic_h-$this->_height);
  309. break;
  310. case 'BR':
  311. $offset_w = (int)($pic_w-$this->_width);
  312. $offset_h = (int)($pic_h-$this->_height);
  313. break;
  314. }
  315. return array($offset_w, $offset_h);
  316. }
  317. /** 添加水印
  318. * @param String $dest 图片路径
  319. */
  320. private function add_watermark($dest){
  321. if($this->_watermark!=null && file_exists($this->_watermark) && file_exists($dest)){
  322. list($owidth, $oheight, $otype) = getimagesize($dest);
  323. list($w, $h, $wtype) = getimagesize($this->_watermark);
  324. // 水印图比原图要小才加水印
  325. if($w
  326. if($this->_handler=='imagemagick'){ // imagemagick 添加水印
  327. $cmd = sprintf("composite -gravity %s -geometry %s -dissolve %s '%s' %s %s", $this->_gravity, $this->_geometry, $this->_opacity, $this->_watermark, $dest, $dest);
  328. $this->to_log($cmd);
  329. exec($cmd);
  330. }else{ // gd 添加水印
  331. switch($wtype){
  332. case 1: $water_img = imagecreatefromgif($this->_watermark); break;
  333. case 2: $water_img = imagecreatefromjpeg($this->_watermark); break;
  334. case 3: $water_img = imagecreatefrompng($this->_watermark); break;
  335. default: return false;
  336. }
  337. switch($otype){
  338. case 1: $dest_img = imagecreatefromgif($dest); break;
  339. case 2: $dest_img = imagecreatefromjpeg($dest); break;
  340. case 3: $dest_img = imagecreatefrompng($dest); break;
  341. default: return false;
  342. }
  343. // 水印位置
  344. switch(strtolower($this->_gravity)){
  345. case 'northwest':
  346. $posX = 0;
  347. $posY = 0;
  348. break;
  349. case 'north':
  350. $posX = ($owidth - $w) / 2;
  351. $posY = 0;
  352. break;
  353. case 'northeast':
  354. $posX = $owidth - $w;
  355. $posY = 0;
  356. break;
  357. case 'west':
  358. $posX = 0;
  359. $posY = ($oheight - $h) / 2;
  360. break;
  361. case 'center':
  362. $posX = ($owidth - $w) / 2;
  363. $posY = ($oheight - $h) / 2;
  364. break;
  365. case 'east':
  366. $posX = $owidth - $w;
  367. $posY = ($oheight - $h) / 2;
  368. break;
  369. case 'southwest':
  370. $posX = 0;
  371. $posY = $oheight - $h;
  372. break;
  373. case 'south':
  374. $posX = ($owidth - $w) / 2;
  375. $posY = $oheight - $h;
  376. break;
  377. case 'southeast':
  378. $posX = $owidth - $w;
  379. $posY = $oheight - $h;
  380. break;
  381. }
  382. imagealphablending($dest_img, true);
  383. imagecopy($dest_img, $water_img, $posX, $posY, 0, 0, $w, $h);
  384. switch($otype){
  385. case 1:imagegif($dest_img, $dest, $this->_quality); break;
  386. case 2:imagejpeg($dest_img, $dest, $this->_quality); break;
  387. case 3:imagepng($dest_img, $dest, (int)(($this->_quality-1)/10)); break;
  388. }
  389. if(isset($water_img)){
  390. imagedestroy($water_img);
  391. }
  392. if(isset($dest_img)){
  393. imagedestroy($dest_img);
  394. }
  395. }
  396. }
  397. }
  398. }
  399. /** 判断处理程序是否已安装
  400. * @return boolean
  401. */
  402. private function check_handler(){
  403. $handler = $this->_handler;
  404. if(!in_array($handler, array('imagemagick', 'gd', null))){
  405. return false;
  406. }
  407. // 检查是否有安装imagemagick
  408. $imagemagick_installed = strstr(shell_exec('convert -version'),'Version: ImageMagick')!=''? true : false;
  409. // 检查是否有安装gd库
  410. $gd_installed = function_exists('gd_info')? true : false;
  411. switch($handler){
  412. case 'imagemagick':
  413. return $imagemagick_installed;
  414. break;
  415. case 'gd':
  416. return $gd_installed;
  417. break;
  418. case null:
  419. if($imagemagick_installed){
  420. $this->_handler = 'imagemagick';
  421. return true;
  422. }
  423. if($gd_installed){
  424. $this->_handler = 'gd';
  425. return true;
  426. }
  427. break;
  428. }
  429. return false;
  430. }
  431. /** 创建图片目录
  432. * @param String $path
  433. * @return boolean
  434. */
  435. private function create_dirs($dest){
  436. if(!is_dir(dirname($dest))){
  437. return mkdir(dirname($dest), 0777, true);
  438. }
  439. return true;
  440. }
  441. /** 判断参数是否存在
  442. * @param Array $obj 数组对象
  443. * @param String $key 要查找的key
  444. * @return boolean
  445. */
  446. private function exists($obj,$key=''){
  447. if($key==''){
  448. return isset($obj) && !empty($obj);
  449. }else{
  450. $keys = explode('.',$key);
  451. for($i=0,$max=count($keys); $i if(isset($obj[$keys[$i]])){
  452. $obj = $obj[$keys[$i]];
  453. }else{
  454. return false;
  455. }
  456. }
  457. return isset($obj) && !empty($obj);
  458. }
  459. }
  460. /** 记录log
  461. * @param String $msg 要记录的log讯息
  462. */
  463. private function to_log($msg){
  464. if($this->_log){
  465. $msg = '['.date('Y-m-d H:i:s').']'.$msg."\r\n";
  466. file_put_contents($this->_log, $msg, FILE_APPEND);
  467. }
  468. }
  469. /** hex颜色转rgb颜色
  470. * @param String $color hex颜色
  471. * @return Array
  472. */
  473. private function hex2rgb($hexcolor){
  474. $color = str_replace('#', '', $hexcolor);
  475. if (strlen($color) > 3) {
  476. $rgb = array(
  477. 'r' => hexdec(substr($color, 0, 2)),
  478. 'g' => hexdec(substr($color, 2, 2)),
  479. 'b' => hexdec(substr($color, 4, 2))
  480. );
  481. } else {
  482. $r = substr($color, 0, 1) . substr($color, 0, 1);
  483. $g = substr($color, 1, 1) . substr($color, 1, 1);
  484. $b = substr($color, 2, 1) . substr($color, 2, 1);
  485. $rgb = array(
  486. 'r' => hexdec($r),
  487. 'g' => hexdec($g),
  488. 'b' => hexdec($b)
  489. );
  490. }
  491. return $rgb;
  492. }
  493. /** 获取图片类型
  494. * @param String $file 图片路径
  495. * @return int
  496. */
  497. private function get_file_ext($file){
  498. $filename = basename($file);
  499. list($name, $ext)= explode('.', $filename);
  500. $ext_type = 0;
  501. switch(strtolower($ext)){
  502. case 'jpg':
  503. case 'jpeg':
  504. $ext_type = 2;
  505. break;
  506. case 'gif':
  507. $ext_type = 1;
  508. break;
  509. case 'png':
  510. $ext_type = 3;
  511. break;
  512. }
  513. return $ext_type;
  514. }
  515. } // class end
  516. ?>
  517. demo:
  518. [php] view plaincopy
  519. define('ROOT', dirname(__FILE__));
  520. require(ROOT."/PicThumb.class.php");
  521. $logfile = ROOT.'/PicThumb.log';
  522. $source1 = ROOT.'/pic/source.jpg';
  523. $dest1 = ROOT.'/pic/1.jpg';
  524. $dest2 = ROOT.'/pic/2.gif';
  525. $dest3 = ROOT.'/pic/3.png';
  526. $source2 = ROOT.'/pic/source_cmyk.jpg';
  527. $dest4 = ROOT.'/pic/4.jpg';
  528. $dest5 = ROOT.'/pic/5.gif';
  529. $dest6 = ROOT.'/pic/6.png';
  530. $watermark = ROOT.'/pic/watermark.png';
  531. // 按比例生成缩略图
  532. $param = array(
  533. 'type' => 'fit',
  534. 'width' => 100,
  535. 'height' => 100,
  536. );
  537. $obj = new PicThumb($logfile);
  538. $obj->set_config($param);
  539. $flag = $obj->create_thumb($source1, $dest1);
  540. if($flag){ // bbs.it-home.org
  541. echo 'php 缩略图生成类(支持imagemagick与gd库) ';
  542. }else{
  543. echo 'create thumb fail';
  544. }
  545. // 按比例生成缩略图,不足部分用#FF0000填充
  546. $param = array(
  547. 'type' => 'fit',
  548. 'width' => 100,
  549. 'height' => 100,
  550. 'bgcolor' => '#FFFF00'
  551. );
  552. $obj = new PicThumb($logfile);
  553. $obj->set_config($param);
  554. $flag = $obj->create_thumb($source1, $dest2);
  555. if($flag){
  556. echo 'php 缩略图生成类(支持imagemagick与gd库) ';
  557. }else{
  558. echo 'create thumb fail';
  559. }
  560. // 裁剪250x250的缩略图,裁剪位置是底部中间,水印位置西南,透明度50
  561. $param = array(
  562. 'type' => 'crop',
  563. 'croppos' => 'BM',
  564. 'width' => 250,
  565. 'height' => 250,
  566. 'watermark' => $watermark,
  567. 'opacity' => 50,
  568. 'gravity' => 'SouthWest'
  569. );
  570. $obj = new PicThumb($logfile);
  571. $obj->set_config($param);
  572. $flag = $obj->create_thumb($source1, $dest3);
  573. if($flag){
  574. echo 'php 缩略图生成类(支持imagemagick与gd库) ';
  575. }else{
  576. echo 'create thumb fail';
  577. }
  578. // 按比例生成缩略图 CMYK格式
  579. $param = array(
  580. 'type' => 'fit',
  581. 'width' => 100,
  582. 'height' => 100,
  583. );
  584. $obj = new PicThumb($logfile);
  585. $obj->set_config($param);
  586. $flag = $obj->create_thumb($source2, $dest4);
  587. if($flag){
  588. echo 'php 缩略图生成类(支持imagemagick与gd库) ';
  589. }else{
  590. echo 'create thumb fail';
  591. }
  592. // 按比例生成缩略图,不足部分用#FF0000填充 CMYK格式

  593. $param = array(
  594. 'type' => 'fit',
  595. 'width' => 100,
  596. 'height' => 100,
  597. 'bgcolor' => '#FFFF00'
  598. );
  599. $obj = new PicThumb($logfile);
  600. $obj->set_config($param);
  601. $flag = $obj->create_thumb($source2, $dest5);
  602. if($flag){
  603. echo 'php 缩略图生成类(支持imagemagick与gd库) ';
  604. }else{
  605. echo 'create thumb fail';
  606. }
  607. // 裁剪250x250的缩略图,裁剪位置是底部中间,水印位置西南,透明度50 CMYK格式
  608. $param = array(
  609. 'type' => 'crop',
  610. 'croppos' => 'BM',
  611. 'width' => 250,
  612. 'height' => 250,
  613. 'watermark' => $watermark,
  614. 'opacity' => 50,
  615. 'gravity' => 'SouthWest'
  616. );
  617. $obj = new PicThumb($logfile);
  618. $obj->set_config($param);
  619. $flag = $obj->create_thumb($source2, $dest6);
  620. if($flag){
  621. echo 'php 缩略图生成类(支持imagemagick与gd库) ';
  622. }else{
  623. echo 'create thumb fail';
  624. }
  625. ?>
复制代码

>>> php缩略图生成类源码下载地址



Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn