Discuz教程网

简单的图片处理类

[复制链接]
authicon 09927306 发表于 2011-1-12 16:59:16 | 显示全部楼层 |阅读模式
  1. <?php
  2. /**
  3. * Image Class
  4. * Driver: GD Library
  5. * 暂时未处理当缩略图比原图片小时 无法添加水印的情况。
  6. */
  7. class Image {

  8. public $_sourceImg ; // 源图片
  9. public $_tmpImg; // 操作图片
  10. public $_imgType ; // 图片后缀
  11. public $_create; // 执行方法
  12. public $_save; // 保存方法

  13. public function __construct($image) {

  14. if(is_file($image)){
  15. @chmod($image, 0777);
  16. $this->_sourceImg = $image;
  17. $this->_imgType = pathinfo($image, PATHINFO_EXTENSION);
  18. $this->_tmpImg = dirname($image).\'/\'.\'thumb_\'.basename($image);
  19. @copy($this->_sourceImg, $this->_tmpImg);
  20. @chmod($this->_tmpImg,0777);
  21. switch($this->_imgType){
  22. case \'gif\' :
  23. $this->_save = "imagegif";
  24. $this->_create = \'imagecreatefromgif\';
  25. break;
  26. case \'png\' :
  27. $this->_save = "imagepng";
  28. $this->_create = \'imagecreatefrompng\';
  29. break;
  30. case \'jpg\' :
  31. case \'jpeg\' :
  32. $this->_save = "imagejpeg";
  33. $this->_create = \'imagecreatefromjpeg\';
  34. break;
  35. default :
  36. throw new Exception("ERROR; UNSUPPORTED IMAGE TYPE");
  37. break;
  38. }
  39. }else{
  40. throw new Exception($image.\' is not a Image-Source!\');
  41. }
  42. }

  43. /*
  44. * 缩略图片
  45. * @param width Integer 图片剪裁后宽度
  46. * @param width Integer 图片剪裁后高度
  47. * @param auto bool 是否等比例额剪裁
  48. * @param xoffset Integer 剪裁左端偏移量
  49. * @param yoffset Integer 剪裁顶端偏移量
  50. ***/
  51. function resize($width, $height, $auto = true, $xoffset = 0, $yoffset = 0){
  52. if($width > $height){
  53. $size = $width;
  54. }else{
  55. $size = $height;
  56. }
  57. $_create = $this->_create;
  58. $_save = $this->_save;
  59. $img = $_create($this->_sourceImg);
  60. if($auto == TRUE){
  61. list($org_width, $org_height) = getimagesize($this->_sourceImg);
  62. if($org_width < $size && $org_height < $size){
  63. $img4= $img;
  64. }else{
  65. if($org_width > $org_height){
  66. $swidth = $size;
  67. $sheight = ($org_height/$org_width) * $size;
  68. $img4=imagecreatetruecolor ($swidth, $sheight);
  69. imagecopyresampled($img4, $img, 0, 0, 0, 0, $swidth, $sheight, $org_width, $org_height);
  70. }else{
  71. $swidth = ($org_width/$org_height) * $size;
  72. $sheight = $size;
  73. $img4=imagecreatetruecolor ($swidth, $sheight);
  74. imagecopyresampled($img4, $img, 0, 0, 0, 0, $swidth, $sheight, $org_width, $org_height);
  75. }
  76. }
  77. $value = $this->_imgType == \'png\' ? 9 : 100;
  78. $_save($img4,$this->_tmpImg,$value);
  79. $img = $_create($this->_tmpImg);
  80. }else{
  81. // 自定义裁切
  82. $img_n=imagecreatetruecolor($width, $height);
  83. imagecopyresized($img_n, $img, 0, 0, $xoffset, $yoffset, $width, $height, $width, $height);
  84. $value = $this->_imgType == \'png\' ? 9 : 100; // PNG图片质量最高为9 其他格式为 100 默认为75
  85. $_save($img_n,$this->_tmpImg,$value);
  86. }
  87. return $this;
  88. }

  89. /*
  90. * 添加水印
  91. $gWaterPos = 9;//水印位置 0:随机 1:顶端居左 2:顶端居中 3:顶端居右 4:中部居左 5:中部居中 6:中部居右 7:底端居左 8:底端居中 9:底端居右
  92. $gWaterMarkType = \'text\';//text:用字符串作水印 img:用图片作水印
  93. $groundImage = \'\' 原图
  94. $gWaterImg = \'1.jpg\';//作为水印的图片,支持GIF,JPG,PNG格式
  95. $gWaterText = \'text\';//字符串内容 支持中文
  96. $gWaterFontSize = 28;//字体大小
  97. $gWaterTextColor = \'#FF0000\'; //字体颜色
  98. $gWaterTtfFile = \'arial.ttf\'; //ttf文件,可从C:\\WINDOWS\\Fonts得到
  99. */
  100. function makeWater($gWaterPos = 9, $gWaterMarkType=\'img\', $groundImage = \'\',$gWaterImg=\'water.jpg\',$gWaterText = \'\',$gWaterFontSize = 28,$gWaterTextColor= \'#FF0000\', $gwaterTtfFile = \'arial.ttf\') {
  101. $groundImage = $this->_tmpImg;
  102. //读取水印文件
  103. if($gWaterMarkType == \'img\'){
  104. if(!emptyempty($gWaterImg) && file_exists($gWaterImg)) {
  105. list($water_w,$water_h,$water_t) = getimagesize($gWaterImg);
  106. switch($water_t) {
  107. case 1:$water_im = imagecreatefromgif($gWaterImg);break;
  108. case 2:$water_im = imagecreatefromjpeg($gWaterImg);break;
  109. case 3:$water_im = imagecreatefrompng($gWaterImg);break;
  110. default:die($formatMsg);
  111. }
  112. }else{
  113. throw new Exception(\'the waterImg is not fined!\');
  114. }
  115. }
  116. //读取背景图片
  117. if(!emptyempty($groundImage) && file_exists($groundImage)) {
  118. list($ground_w,$ground_h,$ground_t) = getimagesize($groundImage);
  119. switch($ground_t) {
  120. case 1:$ground_im = imagecreatefromgif($groundImage);break;
  121. case 2:$ground_im = imagecreatefromjpeg($groundImage);break;
  122. case 3:$ground_im = imagecreatefrompng($groundImage);break;
  123. default:die($formatMsg);
  124. }
  125. }else{
  126. throw new Exception(\'the BackgroundImg is not fined!\');
  127. }
  128. //水印位置
  129. if($gWaterMarkType == \'img\') {
  130. $w = $water_w;
  131. $h = $water_h;
  132. }else{
  133. $temp = imagettfbbox(ceil($gWaterFontSize),0,$gWaterTtfFile,$gWaterText);//取得使用 TrueType 字体的文本的范围
  134. $w = $temp[2] - $temp[6];
  135. $h = $temp[3] - $temp[7];
  136. unset($temp);
  137. }
  138. if($ground_w < $w || $ground_h < $h) {
  139. throw new Exception(\'the waterImg is too small!\');
  140. }
  141. switch($gWaterPos) {
  142. case 0://随机
  143. $posX = rand(0,($ground_w - $w));
  144. $posY = rand(0,($ground_h - $h));
  145. break;
  146. case 1://1为顶端居左
  147. $posX = 0;
  148. $posY = 0;
  149. break;
  150. case 2://2为顶端居中
  151. $posX = ($ground_w - $w) / 2;
  152. $posY = 0;
  153. break;
  154. case 3://3为顶端居右
  155. $posX = $ground_w - $w;
  156. $posY = 0;
  157. break;
  158. case 4://4为中部居左
  159. $posX = 0;
  160. $posY = ($ground_h - $h) / 2;
  161. break;
  162. case 5://5为中部居中
  163. $posX = ($ground_w - $w) / 2;
  164. $posY = ($ground_h - $h) / 2;
  165. break;
  166. case 6://6为中部居右
  167. $posX = $ground_w - $w;
  168. $posY = ($ground_h - $h) / 2;
  169. break;
  170. case 7://7为底端居左
  171. $posX = 0;
  172. $posY = $ground_h - $h;
  173. break;
  174. case 8://8为底端居中
  175. $posX = ($ground_w - $w) / 2;
  176. $posY = $ground_h - $h;
  177. break;
  178. case 9://9为底端居右
  179. $posX = $ground_w - $w;
  180. $posY = $ground_h - $h;
  181. break;
  182. default://随机
  183. $posX = rand(0,($ground_w - $w));
  184. $posY = rand(0,($ground_h - $h));
  185. break;
  186. }
  187. //设定图像的混色模式
  188. imagealphablending($ground_im, true);
  189. if($gWaterMarkType == \'img\'){
  190. imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件
  191. }else{
  192. if(!emptyempty($gWaterTextColor) && (strlen($gWaterTextColor)==7) ) {
  193. $R = hexdec(substr($gWaterTextColor,1,2));
  194. $G = hexdec(substr($gWaterTextColor,3,2));
  195. $B = hexdec(substr($gWaterTextColor,5));
  196. }else{
  197. throw new Exception(\'The waterText color format error!\');
  198. }
  199. imagettftext($ground_im,$gWaterFontSize,0,$posX,$posY,imagecolorallocate($ground_im,$R,$G,$B),$gWaterTtfFile, iconv("GB2312","UTF-8",$gWaterText));
  200. }
  201. //生成水印后的图片
  202. @unlink($groundImage);
  203. switch($ground_t) {
  204. case 1:imagegif($ground_im,$groundImage);break;
  205. case 2:imagejpeg($ground_im,$groundImage);break;
  206. case 3:imagepng($ground_im,$groundImage);break;
  207. default:throw new Exception(\'The backgoundImage is not Support MakeWaterImage!\');
  208. }
  209. //释放内存
  210. if(isset($water_info)){
  211. unset($water_info);
  212. }
  213. if(isset($water_im)){
  214. imagedestroy($water_im);
  215. }
  216. unset($ground_info);
  217. imagedestroy($ground_im);
  218. return $this;
  219. }

  220. /*
  221. * 返回处理后的图片地址
  222. * @param old bool 是否替换原图
  223. * return String
  224. **/
  225. public function save($old = false) {
  226. if($old){
  227. @unlink($this->_sourceImg);
  228. @rename($this->_tmpImg, $this->_sourceImg);
  229. return $this->_sourceImg;
  230. }
  231. return $this->_tmpImg;
  232. }

  233. /*
  234. * 显示图片
  235. * @paras source String 图片路径
  236. **/
  237. public function render($source = TRUE) {
  238. switch($this->_imgType){
  239. case \'jpg\':
  240. case \'jpeg\':
  241. header(\'Content-Type: image/jpeg\');
  242. break;
  243. case \'gif\':
  244. header(\'Content-Type: image/gif\');
  245. break;
  246. case \'png\':
  247. header(\'Content-Type: image/png\');
  248. break;
  249. }
  250. $imgSrc = $source ? $this->_sourceImg : $this->_tmpImg;
  251. $_create = $this->_create;
  252. $_save = $this->_save;
  253. $source = $_create($imgSrc);
  254. $_save($source);
  255. imagedestroy($imgResource);
  256. }
  257. }
  258. //// 测试用例
  259. //$img = new Image(\'test.jpg\');
  260. //$img->render();
  261. ////$saveFileName = $img->resize(200,200,false,300,100)->makewater(9)->save();//自定义裁切 添加水印
  262. //$saveFileName = $img->resize(200,200)->save(); // 等比例缩略
  263. //$saveFileName = $img->resize(300,200)->makewater(9)->save(); // 等比例缩略 添加水印
  264. //$saveFileName = $img->makewater(1)->save(); // 制作水印
  265. //echo $saveFileName;
复制代码




上一篇:Smarty使用自定义资源
下一篇:简单的文件上传类
authicon fhiejkl 发表于 2011-6-24 14:00:00 | 显示全部楼层
哈哈,支持了
authicon 暗夜的烟火 发表于 2011-6-25 16:59:57 | 显示全部楼层
很好 很强大。。谢谢分享
authicon TRACYFLYING 发表于 2011-6-26 18:59:58 | 显示全部楼层
真的有意思!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-3 07:52

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表