PHP多功能图片处理类

  1. <!--?php
  2. /**
  3. * 基本图片处理,用于完成图片缩入,水印添加
  4. * 当水印图超过目标图片尺寸时,水印图能自动适应目标图片而缩小
  5. * 水印图可以设置跟背景的合并度
  6. *
  7. * Copyright(c) 2005 by ustb99. All rights reserved
  8. *
  9. * To contact the author write to {@link mailto:ustb80@163.com}
  10. *
  11. * @author 偶然
  12. * @version $Id: thumb.class.php,v 1.9 2006/09/30 09:31:56 zengjian Exp $
  13. * @package system
  14. */
  15. /**
  16. * ThumbHandler
  17. * @access public
  18. */
  19. /*
  20. 使用方法:
  21. 自动裁切:
  22. 程序会按照图片的尺寸从中部裁切最大的正方形,并按目标尺寸进行缩略
  23. $t--->setSrcImg("img/test.jpg");
  24. $t->setCutType(1);//这一句就OK了
  25. $t->setDstImg("tmp/new_test.jpg");
  26. $t->createImg(60,60);
  27. 手工裁切:
  28. 程序会按照指定的位置从源图上取图
  29. $t->setSrcImg("img/test.jpg");
  30. $t->setCutType(2);//指明为手工裁切
  31. $t->setSrcCutPosition(100, 100);// 源图起点坐标
  32. $t->setRectangleCut(300, 200);// 裁切尺寸
  33. $t->setDstImg("tmp/new_test.jpg");
  34. $t->createImg(300,200);
  35. */
  36. class ThumbHandler
  37. {
  38. var $dst_img;// 目标文件
  39. var $h_src; // 图片资源句柄
  40. var $h_dst;// 新图句柄
  41. var $h_mask;// 水印句柄
  42. var $img_create_quality = 100;// 图片生成质量
  43. var $img_display_quality = 80;// 图片显示质量,默认为75
  44. var $img_scale = 0;// 图片缩放比例
  45. var $src_w = 0;// 原图宽度
  46. var $src_h = 0;// 原图高度
  47. var $dst_w = 0;// 新图总宽度
  48. var $dst_h = 0;// 新图总高度
  49. var $fill_w;// 填充图形宽
  50. var $fill_h;// 填充图形高
  51. var $copy_w;// 拷贝图形宽
  52. var $copy_h;// 拷贝图形高
  53. var $src_x = 0;// 原图绘制起始横坐标
  54. var $src_y = 0;// 原图绘制起始纵坐标
  55. var $start_x;// 新图绘制起始横坐标
  56. var $start_y;// 新图绘制起始纵坐标
  57. var $mask_word;// 水印文字
  58. var $mask_img;// 水印图片
  59. var $mask_pos_x = 0;// 水印横坐标
  60. var $mask_pos_y = 0;// 水印纵坐标
  61. var $mask_offset_x = 5;// 水印横向偏移
  62. var $mask_offset_y = 5;// 水印纵向偏移
  63. var $font_w;// 水印字体宽
  64. var $font_h;// 水印字体高
  65. var $mask_w;// 水印宽
  66. var $mask_h;// 水印高
  67. var $mask_font_color = "#ffffff";// 水印文字颜色
  68. var $mask_font = 2;// 水印字体
  69. var $font_size;// 尺寸
  70. var $mask_position = 0;// 水印位置
  71. var $mask_img_pct = 50;// 图片合并程度,值越大,合并程序越低
  72. var $mask_txt_pct = 50;// 文字合并程度,值越小,合并程序越低
  73. var $img_border_size = 0;// 图片边框尺寸
  74. var $img_border_color;// 图片边框颜色
  75. var $_flip_x=0;// 水平翻转次数
  76. var $_flip_y=0;// 垂直翻转次数
  77. var $cut_type=0;// 剪切类型
  78. var $img_type;// 文件类型
  79. // 文件类型定义,并指出了输出图片的函数
  80. var $all_type = array(
  81. "jpg" => array("output"=>"imagejpeg"),
  82. "gif" => array("output"=>"imagegif"),
  83. "png" => array("output"=>"imagepng"),
  84. "wbmp" => array("output"=>"image2wbmp"),
  85. "jpeg" => array("output"=>"imagejpeg"));
  86. /**
  87. * 构造函数
  88. */
  89. function ThumbHandler()
  90. {
  91. $this->mask_font_color = "#ffffff";
  92. $this->font = 2;
  93. $this->font_size = 12;
  94. }
  95. /**
  96. * 取得图片的宽
  97. */
  98. function getImgWidth($src)
  99. {
  100. return imagesx($src);
  101. }
  102. /**
  103. * 取得图片的高
  104. */
  105. function getImgHeight($src)
  106. {
  107. return imagesy($src);
  108. }
  109. /**
  110. * 设置图片生成路径
  111. *
  112. * @param string $src_img 图片生成路径
  113. */
  114. function setSrcImg($src_img, $img_type=null)
  115. {
  116. if(!file_exists($src_img))
  117. {
  118. die("图片不存在");
  119. }
  120. if(!emptyempty($img_type))
  121. {
  122. $this->img_type = $img_type;
  123. }
  124. else
  125. {
  126. $this->img_type = $this->_getImgType($src_img);
  127. }
  128. $this->_checkValid($this->img_type);
  129. // file_get_contents函数要求php版本>4.3.0
  130. $src = '';
  131. if(function_exists("file_get_contents"))
  132. {
  133. $src = file_get_contents($src_img);
  134. }
  135. else
  136. {
  137. $handle = fopen ($src_img, "r");
  138. while (!feof ($handle))
  139. {
  140. $src .= fgets($fd, 4096);
  141. }
  142. fclose ($handle);
  143. }
  144. if(emptyempty($src))
  145. {
  146. die("图片源为空");
  147. }
  148. $this->h_src = @ImageCreateFromString($src);
  149. $this->src_w = $this->getImgWidth($this->h_src);
  150. $this->src_h = $this->getImgHeight($this->h_src);
  151. }
  152. /**
  153. * 设置图片生成路径
  154. *
  155. * @param string $dst_img 图片生成路径
  156. */
  157. function setDstImg($dst_img)
  158. {
  159. $arr = explode('/',$dst_img);
  160. $last = array_pop($arr);
  161. $path = implode('/',$arr);
  162. $this->_mkdirs($path);
  163. $this->dst_img = $dst_img;
  164. }
  165. /**
  166. * 设置图片的显示质量
  167. *
  168. * @param string $n 质量
  169. */
  170. function setImgDisplayQuality($n)
  171. {
  172. $this->img_display_quality = (int)$n;
  173. }
  174. /**
  175. * 设置图片的生成质量
  176. *
  177. * @param string $n 质量
  178. */
  179. function setImgCreateQuality($n)
  180. {
  181. $this->img_create_quality = (int)$n;
  182. }
  183. /**
  184. * 设置文字水印
  185. *
  186. * @param string $word 水印文字
  187. * @param integer $font 水印字体
  188. * @param string $color 水印字体颜色
  189. */
  190. function setMaskWord($word)
  191. {
  192. $this->mask_word .= $word;
  193. }
  194. /**
  195. * 设置字体颜色
  196. *
  197. * @param string $color 字体颜色
  198. */
  199. function setMaskFontColor($color="#ffffff")
  200. {
  201. $this->mask_font_color = $color;
  202. }
  203. /**
  204. * 设置水印字体
  205. *
  206. * @param string|integer $font 字体
  207. */
  208. function setMaskFont($font=2)
  209. {
  210. if(!is_numeric($font) && !file_exists($font))
  211. {
  212. die("字体文件不存在");
  213. }
  214. $this->font = $font;
  215. }
  216. /**
  217. * 设置文字字体大小,仅对truetype字体有效
  218. */
  219. function setMaskFontSize($size = "12")
  220. {
  221. $this->font_size = $size;
  222. }
  223. /**
  224. * 设置图片水印
  225. *
  226. * @param string $img 水印图片源
  227. */
  228. function setMaskImg($img)
  229. {
  230. $this->mask_img = $img;
  231. }
  232. /**
  233. * 设置水印横向偏移
  234. *
  235. * @param integer $x 横向偏移量
  236. */
  237. function setMaskOffsetX($x)
  238. {
  239. $this->mask_offset_x = (int)$x;
  240. }
  241. /**
  242. * 设置水印纵向偏移
  243. *
  244. * @param integer $y 纵向偏移量
  245. */
  246. function setMaskOffsetY($y)
  247. {
  248. $this->mask_offset_y = (int)$y;
  249. }
  250. /**
  251. * 指定水印位置
  252. *
  253. * @param integer $position 位置,1:左上,2:左下,3:右上,0/4:右下
  254. */
  255. function setMaskPosition($position=0)
  256. {
  257. $this->mask_position = (int)$position;
  258. }
  259. /**
  260. * 设置图片合并程度
  261. *
  262. * @param integer $n 合并程度
  263. */
  264. function setMaskImgPct($n)
  265. {
  266. $this->mask_img_pct = (int)$n;
  267. }
  268. /**
  269. * 设置文字合并程度
  270. *
  271. * @param integer $n 合并程度
  272. */
  273. function setMaskTxtPct($n)
  274. {
  275. $this->mask_txt_pct = (int)$n;
  276. }
  277. /**
  278. * 设置缩略图边框
  279. *
  280. * @param (类型) (参数名) (描述)
  281. */
  282. function setDstImgBorder($size=1, $color="#000000")
  283. {
  284. $this->img_border_size = (int)$size;
  285. $this->img_border_color = $color;
  286. }
  287. /**
  288. * 水平翻转
  289. */
  290. function flipH()
  291. {
  292. $this->_flip_x++;
  293. }
  294. /**
  295. * 垂直翻转
  296. */
  297. function flipV()
  298. {
  299. $this->_flip_y++;
  300. }
  301. /**
  302. * 设置剪切类型
  303. *
  304. * @param (类型) (参数名) (描述)
  305. */
  306. function setCutType($type)
  307. {
  308. $this->cut_type = (int)$type;
  309. }
  310. /**
  311. * 设置图片剪切
  312. *
  313. * @param integer $width 矩形剪切
  314. */
  315. function setRectangleCut($width, $height)
  316. {
  317. $this->fill_w = (int)$width;
  318. $this->fill_h = (int)$height;
  319. }
  320. /**
  321. * 设置源图剪切起始坐标点
  322. *
  323. * @param (类型) (参数名) (描述)
  324. */
  325. function setSrcCutPosition($x, $y)
  326. {
  327. $this->src_x = (int)$x;
  328. $this->src_y = (int)$y;
  329. }
  330. /**
  331. * 创建图片,主函数
  332. * @param integer $a 当缺少第二个参数时,此参数将用作百分比,
  333. * 否则作为宽度值
  334. * @param integer $b 图片缩放后的高度
  335. */
  336. function createImg($a, $b=null)
  337. {
  338. $num = func_num_args();
  339. if(1 == $num)
  340. {
  341. $r = (int)$a;
  342. if($r < 1)
  343. {
  344. die("图片缩放比例不得小于1");
  345. }
  346. $this->img_scale = $r;
  347. $this->_setNewImgSize($r);
  348. }
  349. if(2 == $num)
  350. {
  351. $w = (int)$a;
  352. $h = (int)$b;
  353. if(0 == $w)
  354. {
  355. die("目标宽度不能为0");
  356. }
  357. if(0 == $h)
  358. {
  359. die("目标高度不能为0");
  360. }
  361. $this->_setNewImgSize($w, $h);
  362. }
  363. if($this->_flip_x%2!=0)
  364. {
  365. $this->_flipH($this->h_src);
  366. }
  367. if($this->_flip_y%2!=0)
  368. {
  369. $this->_flipV($this->h_src);
  370. }
  371. $this->_createMask();
  372. $this->_output();
  373. // 释放
  374. if(imagedestroy($this->h_src) && imagedestroy($this->h_dst))
  375. {
  376. Return true;
  377. }
  378. else
  379. {
  380. Return false;
  381. }
  382. }
  383. /**
  384. * 生成水印,调用了生成水印文字和水印图片两个方法
  385. */
  386. function _createMask()
  387. {
  388. if($this->mask_word)
  389. {
  390. // 获取字体信息
  391. $this->_setFontInfo();
  392. if($this->_isFull())
  393. {
  394. die("水印文字过大");
  395. }
  396. else
  397. {
  398. $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);
  399. $white = ImageColorAllocate($this->h_dst,255,255,255);
  400. imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色
  401. $this->_drawBorder();
  402. imagecopyresampled( $this->h_dst, $this->h_src,
  403. $this->start_x, $this->start_y,
  404. $this->src_x, $this->src_y,
  405. $this->fill_w, $this->fill_h,
  406. $this->copy_w, $this->copy_h);
  407. $this->_createMaskWord($this->h_dst);
  408. }
  409. }
  410. if($this->mask_img)
  411. {
  412. $this->_loadMaskImg();//加载时,取得宽高
  413. if($this->_isFull())
  414. {
  415. // 将水印生成在原图上再拷
  416. $this->_createMaskImg($this->h_src);
  417. $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);
  418. $white = ImageColorAllocate($this->h_dst,255,255,255);
  419. imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色
  420. $this->_drawBorder();
  421. imagecopyresampled( $this->h_dst, $this->h_src,
  422. $this->start_x, $this->start_y,
  423. $this->src_x, $this->src_y,
  424. $this->fill_w, $this->start_y,
  425. $this->copy_w, $this->copy_h);
  426. }
  427. else
  428. {
  429. // 创建新图并拷贝
  430. $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);
  431. $white = ImageColorAllocate($this->h_dst,255,255,255);
  432. imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色
  433. $this->_drawBorder();
  434. imagecopyresampled( $this->h_dst, $this->h_src,
  435. $this->start_x, $this->start_y,
  436. $this->src_x, $this->src_y,
  437. $this->fill_w, $this->fill_h,
  438. $this->copy_w, $this->copy_h);
  439. $this->_createMaskImg($this->h_dst);
  440. }
  441. }
  442. if(emptyempty($this->mask_word) && emptyempty($this->mask_img))
  443. {
  444. $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);
  445. $white = ImageColorAllocate($this->h_dst,255,255,255);
  446. imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色
  447. $this->_drawBorder();
  448. imagecopyresampled( $this->h_dst, $this->h_src,
  449. $this->start_x, $this->start_y,
  450. $this->src_x, $this->src_y,
  451. $this->fill_w, $this->fill_h,
  452. $this->copy_w, $this->copy_h);
  453. }
  454. }
  455. /**
  456. * 画边框
  457. */
  458. function _drawBorder()
  459. {
  460. if(!emptyempty($this->img_border_size))
  461. {
  462. $c = $this->_parseColor($this->img_border_color);
  463. $color = ImageColorAllocate($this->h_src,$c[0], $c[1], $c[2]);
  464. imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$color);// 填充背景色
  465. }
  466. }
  467. /**
  468. * 生成水印文字
  469. */
  470. function _createMaskWord($src)
  471. {
  472. $this->_countMaskPos();
  473. $this->_checkMaskValid();
  474. $c = $this->_parseColor($this->mask_font_color);
  475. $color = imagecolorallocatealpha($src, $c[0], $c[1], $c[2], $this->mask_txt_pct);
  476. if(is_numeric($this->font))
  477. {
  478. imagestring($src,
  479. $this->font,
  480. $this->mask_pos_x, $this->mask_pos_y,
  481. $this->mask_word,
  482. $color);
  483. }
  484. else
  485. {
  486. imagettftext($src,
  487. $this->font_size, 0,
  488. $this->mask_pos_x, $this->mask_pos_y,
  489. $color,
  490. $this->font,
  491. $this->mask_word);
  492. }
  493. }
  494. /**
  495. * 生成水印图
  496. */
  497. function _createMaskImg($src)
  498. {
  499. $this->_countMaskPos();
  500. $this->_checkMaskValid();
  501. imagecopymerge($src,
  502. $this->h_mask,
  503. $this->mask_pos_x ,$this->mask_pos_y,
  504. 0, 0,
  505. $this->mask_w, $this->mask_h,
  506. $this->mask_img_pct);
  507. imagedestroy($this->h_mask);
  508. }
  509. /**
  510. * 加载水印图
  511. */
  512. function _loadMaskImg()
  513. {
  514. $mask_type = $this->_getImgType($this->mask_img);
  515. $this->_checkValid($mask_type);
  516. // file_get_contents函数要求php版本>4.3.0
  517. $src = '';
  518. if(function_exists("file_get_contents"))
  519. {
  520. $src = file_get_contents($this->mask_img);
  521. }
  522. else
  523. {
  524. $handle = fopen ($this->mask_img, "r");
  525. while (!feof ($handle))
  526. {
  527. $src .= fgets($fd, 4096);
  528. }
  529. fclose ($handle);
  530. }
  531. if(emptyempty($this->mask_img))
  532. {
  533. die("水印图片为空");
  534. }
  535. $this->h_mask = ImageCreateFromString($src);
  536. $this->mask_w = $this->getImgWidth($this->h_mask);
  537. $this->mask_h = $this->getImgHeight($this->h_mask);
  538. }
  539. /**
  540. * 图片输出
  541. */
  542. function _output()
  543. {
  544. $img_type = $this->img_type;
  545. $func_name = $this->all_type[$img_type]['output'];
  546. if(function_exists($func_name))
  547. {
  548. // 判断浏览器,若是IE就不发送头
  549. if(isset($_SERVER['HTTP_USER_AGENT']))
  550. {
  551. $ua = strtoupper($_SERVER['HTTP_USER_AGENT']);
  552. if(!preg_match('/^.*MSIE.*\)$/i',$ua))
  553. {
  554. header("Content-type:$img_type");
  555. }
  556. }
  557. $func_name($this->h_dst, $this->dst_img, $this->img_display_quality);
  558. }
  559. else
  560. {
  561. Return false;
  562. }
  563. }
  564. /**
  565. * 分析颜色
  566. *
  567. * @param string $color 十六进制颜色
  568. */
  569. function _parseColor($color)
  570. {
  571. $arr = array();
  572. for($ii=1; $ii<strlen function="" return="" this-="">_isFull())
  573. {
  574. switch($this->mask_position)
  575. {
  576. case 1:
  577. // 左上
  578. $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;
  579. $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;
  580. break;
  581. case 2:
  582. // 左下
  583. $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;
  584. $this->mask_pos_y = $this->src_h - $this->mask_h - $this->mask_offset_y;
  585. break;
  586. case 3:
  587. // 右上
  588. $this->mask_pos_x = $this->src_w - $this->mask_w - $this->mask_offset_x;
  589. $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;
  590. break;
  591. case 4:
  592. // 右下
  593. $this->mask_pos_x = $this->src_w - $this->mask_w - $this->mask_offset_x;
  594. $this->mask_pos_y = $this->src_h - $this->mask_h - $this->mask_offset_y;
  595. break;
  596. default:
  597. // 默认将水印放到右下,偏移指定像素
  598. $this->mask_pos_x = $this->src_w - $this->mask_w - $this->mask_offset_x;
  599. $this->mask_pos_y = $this->src_h - $this->mask_h - $this->mask_offset_y;
  600. break;
  601. }
  602. }
  603. else
  604. {
  605. switch($this->mask_position)
  606. {
  607. case 1:
  608. // 左上
  609. $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;
  610. $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;
  611. break;
  612. case 2:
  613. // 左下
  614. $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;
  615. $this->mask_pos_y = $this->dst_h - $this->mask_h - $this->mask_offset_y - $this->img_border_size;
  616. break;
  617. case 3:
  618. // 右上
  619. $this->mask_pos_x = $this->dst_w - $this->mask_w - $this->mask_offset_x - $this->img_border_size;
  620. $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;
  621. break;
  622. case 4:
  623. // 右下
  624. $this->mask_pos_x = $this->dst_w - $this->mask_w - $this->mask_offset_x - $this->img_border_size;
  625. $this->mask_pos_y = $this->dst_h - $this->mask_h - $this->mask_offset_y - $this->img_border_size;
  626. break;
  627. default:
  628. // 默认将水印放到右下,偏移指定像素
  629. $this->mask_pos_x = $this->dst_w - $this->mask_w - $this->mask_offset_x - $this->img_border_size;
  630. $this->mask_pos_y = $this->dst_h - $this->mask_h - $this->mask_offset_y - $this->img_border_size;
  631. break;
  632. }
  633. }
  634. }
  635. /**
  636. * 设置字体信息
  637. */
  638. function _setFontInfo()
  639. {
  640. if(is_numeric($this->font))
  641. {
  642. $this->font_w = imagefontwidth($this->font);
  643. $this->font_h = imagefontheight($this->font);
  644. // 计算水印字体所占宽高
  645. $word_length = strlen($this->mask_word);
  646. $this->mask_w = $this->font_w*$word_length;
  647. $this->mask_h = $this->font_h;
  648. }
  649. else
  650. {
  651. $arr = imagettfbbox ($this->font_size,0, $this->font,$this->mask_word);
  652. $this->mask_w = abs($arr[0] - $arr[2]);
  653. $this->mask_h = abs($arr[7] - $arr[1]);
  654. }
  655. }
  656. /**
  657. * 设置新图尺寸
  658. *
  659. * @param integer $img_w 目标宽度
  660. * @param integer $img_h 目标高度
  661. */
  662. function _setNewImgSize($img_w, $img_h=null)
  663. {
  664. $num = func_num_args();
  665. if(1 == $num)
  666. {
  667. $this->img_scale = $img_w;// 宽度作为比例
  668. $this->fill_w = round($this->src_w * $this->img_scale / 100) - $this->img_border_size*2;
  669. $this->fill_h = round($this->src_h * $this->img_scale / 100) - $this->img_border_size*2;
  670. // 源文件起始坐标
  671. $this->src_x = 0;
  672. $this->src_y = 0;
  673. $this->copy_w = $this->src_w;
  674. $this->copy_h = $this->src_h;
  675. // 目标尺寸
  676. $this->dst_w = $this->fill_w + $this->img_border_size*2;
  677. $this->dst_h = $this->fill_h + $this->img_border_size*2;
  678. }
  679. if(2 == $num)
  680. {
  681. $fill_w = (int)$img_w - $this->img_border_size*2;
  682. $fill_h = (int)$img_h - $this->img_border_size*2;
  683. if($fill_w < 0 || $fill_h < 0)
  684. {
  685. die("图片边框过大,已超过了图片的宽度");
  686. }
  687. $rate_w = $this->src_w/$fill_w;
  688. $rate_h = $this->src_h/$fill_h;
  689. switch($this->cut_type)
  690. {
  691. case 0:
  692. // 如果原图大于缩略图,产生缩小,否则不缩小
  693. if($rate_w < 1 && $rate_h < 1)
  694. {
  695. $this->fill_w = (int)$this->src_w;
  696. $this->fill_h = (int)$this->src_h;
  697. }
  698. else
  699. {
  700. if($rate_w >= $rate_h)
  701. {
  702. $this->fill_w = (int)$fill_w;
  703. $this->fill_h = round($this->src_h/$rate_w);
  704. }
  705. else
  706. {
  707. $this->fill_w = round($this->src_w/$rate_h);
  708. $this->fill_h = (int)$fill_h;
  709. }
  710. }
  711. $this->src_x = 0;
  712. $this->src_y = 0;
  713. $this->copy_w = $this->src_w;
  714. $this->copy_h = $this->src_h;
  715. // 目标尺寸
  716. $this->dst_w = $this->fill_w + $this->img_border_size*2;
  717. $this->dst_h = $this->fill_h + $this->img_border_size*2;
  718. break;
  719. // 自动裁切
  720. case 1:
  721. // 如果图片是缩小剪切才进行操作
  722. if($rate_w >= 1 && $rate_h >=1)
  723. {
  724. if($this->src_w > $this->src_h)
  725. {
  726. $src_x = round($this->src_w-$this->src_h)/2;
  727. $this->setSrcCutPosition($src_x, 0);
  728. $this->setRectangleCut($fill_h, $fill_h);
  729. $this->copy_w = $this->src_h;
  730. $this->copy_h = $this->src_h;
  731. }
  732. elseif($this->src_w < $this->src_h)
  733. {
  734. $src_y = round($this->src_h-$this->src_w)/2;
  735. $this->setSrcCutPosition(0, $src_y);
  736. $this->setRectangleCut($fill_w, $fill_h);
  737. $this->copy_w = $this->src_w;
  738. $this->copy_h = $this->src_w;
  739. }
  740. else
  741. {
  742. $this->setSrcCutPosition(0, 0);
  743. $this->copy_w = $this->src_w;
  744. $this->copy_h = $this->src_w;
  745. $this->setRectangleCut($fill_w, $fill_h);
  746. }
  747. }
  748. else
  749. {
  750. $this->setSrcCutPosition(0, 0);
  751. $this->setRectangleCut($this->src_w, $this->src_h);
  752. $this->copy_w = $this->src_w;
  753. $this->copy_h = $this->src_h;
  754. }
  755. // 目标尺寸
  756. $this->dst_w = $this->fill_w + $this->img_border_size*2;
  757. $this->dst_h = $this->fill_h + $this->img_border_size*2;
  758. break;
  759. // 手工裁切
  760. case 2:
  761. $this->copy_w = $this->fill_w;
  762. $this->copy_h = $this->fill_h;
  763. // 目标尺寸
  764. $this->dst_w = $this->fill_w + $this->img_border_size*2;
  765. $this->dst_h = $this->fill_h + $this->img_border_size*2;
  766. break;
  767. default:
  768. break;
  769. }
  770. }
  771. // 目标文件起始坐标
  772. $this->start_x = $this->img_border_size;
  773. $this->start_y = $this->img_border_size;
  774. }
  775. /**
  776. * 检查水印图是否大于生成后的图片宽高
  777. */
  778. function _isFull()
  779. {
  780. Return ( $this->mask_w + $this->mask_offset_x > $this->fill_w
  781. || $this->mask_h + $this->mask_offset_y > $this->fill_h)
  782. ?true:false;
  783. }
  784. /**
  785. * 检查水印图是否超过原图
  786. */
  787. function _checkMaskValid()
  788. {
  789. if( $this->mask_w + $this->mask_offset_x > $this->src_w
  790. || $this->mask_h + $this->mask_offset_y > $this->src_h)
  791. {
  792. die("水印图片尺寸大于原图,请缩小水印图");
  793. }
  794. }
  795. /**
  796. * 取得图片类型
  797. *
  798. * @param string $file_path 文件路径
  799. */
  800. function _getImgType($file_path)
  801. {
  802. $type_list = array("1"=>"gif","2"=>"jpg","3"=>"png","4"=>"swf","5" => "psd","6"=>"bmp","15"=>"wbmp");
  803. if(file_exists($file_path))
  804. {
  805. $img_info = @getimagesize ($file_path);
  806. if(isset($type_list[$img_info[2]]))
  807. {
  808. Return $type_list[$img_info[2]];
  809. }
  810. }
  811. else
  812. {
  813. die("文件不存在,不能取得文件类型!");
  814. }
  815. }
  816. /**
  817. * 检查图片类型是否合法,调用了array_key_exists函数,此函数要求
  818. * php版本大于4.1.0
  819. *
  820. * @param string $img_type 文件类型
  821. */
  822. function _checkValid($img_type)
  823. {
  824. if(!array_key_exists($img_type, $this->all_type))
  825. {
  826. Return false;
  827. }
  828. }
  829. /**
  830. * 按指定路径生成目录
  831. *
  832. * @param string $path 路径
  833. */
  834. function _mkdirs($path)
  835. {
  836. $adir = explode('/',$path);
  837. $dirlist = '';
  838. $rootdir = array_shift($adir);
  839. if(($rootdir!='.'||$rootdir!='..')&&!file_exists($rootdir))
  840. {
  841. @mkdir($rootdir);
  842. }
  843. foreach($adir as $key=>$val)
  844. {
  845. if($val!='.'&&$val!='..')
  846. {
  847. $dirlist .= "/".$val;
  848. $dirpath = $rootdir.$dirlist;
  849. if(!file_exists($dirpath))
  850. {
  851. @mkdir($dirpath);
  852. @chmod($dirpath,0777);
  853. }
  854. }
  855. }
  856. }
  857. /**
  858. * 垂直翻转
  859. *
  860. * @param string $src 图片源
  861. */
  862. function _flipV($src)
  863. {
  864. $src_x = $this->getImgWidth($src);
  865. $src_y = $this->getImgHeight($src);
  866. $new_im = imagecreatetruecolor($src_x, $src_y);
  867. for ($y = 0; $y < $src_y; $y++)
  868. {
  869. imagecopy($new_im, $src, 0, $src_y - $y - 1, 0, $y, $src_x, 1);
  870. }
  871. $this->h_src = $new_im;
  872. }
  873. /**
  874. * 水平翻转
  875. *
  876. * @param string $src 图片源
  877. */
  878. function _flipH($src)
  879. {
  880. $src_x = $this->getImgWidth($src);
  881. $src_y = $this->getImgHeight($src);
  882. $new_im = imagecreatetruecolor($src_x, $src_y);
  883. for ($x = 0; $x < $src_x; $x++)
  884. {
  885. imagecopy($new_im, $src, $src_x - $x - 1, 0, $x, 0, 1, $src_y);
  886. }
  887. $this->h_src = $new_im;
  888. }
  889. }
  890. ?>
  891. 函数描述及例子
  892. 使用实例:
  893. < ?php
  894. require_once('lib/thumb.class.php');
  895. $t = new ThumbHandler();
  896. $t->setSrcImg("img/test.jpg");
  897. $t->setDstImg("tmp/new_test.jpg");
  898. $t->setMaskImg("img/test.gif");
  899. $t->setMaskPosition(1);
  900. $t->setMaskImgPct(80);
  901. $t->setDstImgBorder(4,"#dddddd");
  902. // 指定缩放比例
  903. $t->createImg(300,200);
  904. ?>
  905. <!--?php
  906. require_once('lib/thumb.class.php');
  907. $t = new ThumbHandler();
  908. // 基本使用
  909. $t--->setSrcImg("img/test.jpg");
  910. $t->setMaskWord("test");
  911. $t->setDstImgBorder(10,"#dddddd");
  912. // 指定缩放比例
  913. $t->createImg(50);
  914. ?>
  915. <!--?php
  916. equire_once('lib/thumb.class.php');
  917. $t = new ThumbHandler();
  918. // 基本使用
  919. $t--->setSrcImg("img/test.jpg");
  920. $t->setMaskWord("test");
  921. // 指定固定宽高
  922. $t->createImg(200,200);
  923. ?>
  924. <!--?php
  925. require_once('lib/thumb.class.php');
  926. $t = new ThumbHandler();
  927. $t--->setSrcImg("img/test.jpg");
  928. $t->setDstImg("tmp/new_test.jpg");
  929. $t->setMaskWord("test");
  930. // 指定固定宽高
  931. $t->createImg(200,200);
  932. ?>
  933. <!--?php
  934. require_once('lib/thumb.class.php');
  935. $t = new ThumbHandler();
  936. $t--->setSrcImg("img/test.jpg");
  937. // 指定字体文件地址
  938. $t->setMaskFont("c:/winnt/fonts/arial.ttf");
  939. $t->setMaskFontSize(20);
  940. $t->setMaskFontColor("#ffff00");
  941. $t->setMaskWord("test3333333");
  942. $t->setDstImgBorder(99,"#dddddd");
  943. $t->createImg(50);
  944. ?>
  945. <!--?php
  946. require_once('lib/thumb.class.php');
  947. $t = new ThumbHandler();
  948. $t--->setSrcImg("img/test.jpg");
  949. $t->setMaskOffsetX(55);
  950. $t->setMaskOffsetY(55);
  951. $t->setMaskPosition(1);
  952. //$t->setMaskPosition(2);
  953. //$t->setMaskPosition(3);
  954. //$t->setMaskPosition(4);
  955. $t->setMaskFontColor("#ffff00");
  956. $t->setMaskWord("test");
  957. // 指定固定宽高
  958. $t->createImg(50);
  959. ?>
  960. <!--?php
  961. require_once('lib/thumb.class.php');
  962. $t = new ThumbHandler();
  963. $t--->setSrcImg("img/test.jpg");
  964. $t->setMaskFont("c:/winnt/fonts/simyou.ttf");
  965. $t->setMaskFontSize(20);
  966. $t->setMaskFontColor("#ffffff");
  967. $t->setMaskTxtPct(20);
  968. $t->setDstImgBorder(10,"#dddddd");
  969. $text = "中文";
  970. $str = mb_convert_encoding($text, "UTF-8", "gb2312");
  971. $t->setMaskWord($str);
  972. $t->setMaskWord("test");
  973. // 指定固定宽高
  974. $t->createImg(50);
  975. ?> </strlen>