欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-05-30 17:08:15
...
  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缩略图生成类源码下载地址