首页 > 开发 > PHP > 正文

php实现的通用图片处理类

2024-05-04 23:33:19
字体:
来源:转载
供稿:网友

这篇文章主要介绍了php实现的通用图片处理类,可实现针对图片的缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色等功能,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了php实现的通用图片处理类。分享给大家供大家参考。具体如下:

该图片处理函数功能:缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色,处理并保存历史记录的思路:当有图片有改动时自动生成一张新图片,命名方式可以考虑在原图片的基础上加上步骤,例如:图片名称+__第几步。 在一些需要图片高级处理功能的Web应用中,可以参考这个类。

 

 
  1. <?php 
  2. class picture 
  3. var $PICTURE_URL;//要处理的图片 
  4. var $DEST_URL="temp__01.jpg";//生成目标图片位置 
  5. var $PICTURE_CREATE;//要创建的图片 
  6. var $TURE_COLOR;//新建一个真彩图象 
  7. var $PICTURE_WIDTH;//原图片宽度 
  8. var $PICTURE_HEIGHT;//原图片高度 
  9. /* 
  10. 水印的类型,默认的为水印文字 
  11. */ 
  12. var $MARK_TYPE=1; 
  13. var $WORD;//经过UTF-8后的文字 
  14. var $WORD_X;//文字横坐标 
  15. var $WORD_Y;//文字纵坐标 
  16. var $FONT_TYPE;//字体类型 
  17. var $FONT_SIZE="12";//字体大小 
  18. var $FONT_WORD;//文字 
  19. var $ANGLE=0;//文字的角度,默认为0 
  20. var $FONT_COLOR="#000000";//文字颜色 
  21. var $FONT_PATH="font/simkai.ttf";//字体库,默认为宋体 
  22. var $FORCE_URL;//水印图片 
  23. var $FORCE_X=0;//水印横坐标 
  24. var $FORCE_Y=0;//水印纵坐标 
  25. var $FORCE_START_X=0;//切起水印的图片横坐标 
  26. var $FORCE_START_Y=0;//切起水印的图片纵坐标 
  27. var $PICTURE_TYPE;//图片类型 
  28. var $PICTURE_MIME;//输出的头部 
  29. /* 
  30. 缩放比例为1的话就按缩放高度和宽度缩放 
  31. */ 
  32. var $ZOOM=1;//缩放类型 
  33. var $ZOOM_MULTIPLE;//缩放比例 
  34. var $ZOOM_WIDTH;//缩放宽度 
  35. var $ZOOM_HEIGHT;//缩放高度 
  36. /* 
  37. 裁切,按比例和固定长度、宽度 
  38. */ 
  39. var $CUT_TYPE=1;//裁切类型 
  40. var $CUT_X=0;//裁切的横坐标 
  41. var $CUT_Y=0;//裁切的纵坐标 
  42. var $CUT_;//裁切的宽度 
  43. var $CUT_HEIGHT=100;//裁切的高度 
  44. /* 
  45. 锐化 
  46. */ 
  47. var $SHARP="7.0";//锐化程度 
  48. /* 
  49. 透明度处理 
  50. */ 
  51. var $ALPHA='100';//透明度在0-127之间 
  52. var $ALPHA_X="90"
  53. var $ALPHA_Y="50"
  54. /* 
  55. 任意角度旋转 
  56. */ 
  57. var $CIRCUMROTATE="90.0";//注意,必须为浮点数 
  58. /* 
  59. 出错信息 
  60. */ 
  61. var $ERROR=array
  62. 'unalviable'=>'没有找到相关图片!' 
  63. ); 
  64. /* 
  65. 构造函数:函数初始化 
  66. */ 
  67. function __construct($PICTURE_URL
  68. $this->get_info($PICTURE_URL); 
  69. function get_info($PICTURE_URL
  70. /* 
  71. 处理原图片的信息,先检测图片是否存在,不存在则给出相应的信息 
  72. */ 
  73. @$SIZE=getimagesize($PICTURE_URL); 
  74. if(!$SIZE
  75. exit($this->ERROR['unalviable']); 
  76. //得到原图片的信息类型、宽度、高度 
  77. $this->PICTURE_MIME=$SIZE['mime']; 
  78. $this->PICTURE_; 
  79. $this->PICTURE_HEIGHT=$SIZE[1]; 
  80. //创建图片 
  81. switch($SIZE[2]) 
  82. case 1: 
  83. $this->PICTURE_CREATE=imagecreatefromgif($PICTURE_URL); 
  84. $this->PICTURE_TYPE="imagejpeg"
  85. $this->PICTURE_EXT="jpg"
  86. break
  87. case 2: 
  88. $this->PICTURE_CREATE=imagecreatefromjpeg($PICTURE_URL); 
  89. $this->PICTURE_TYPE="imagegif"
  90. $this->PICTURE_EXT="gif"
  91. break
  92. case 3: 
  93. $this->PICTURE_CREATE=imagecreatefrompng($PICTURE_URL); 
  94. $this->PICTURE_TYPE="imagepng"
  95. $this->PICTURE_EXT="png"
  96. break
  97. }  
  98. /* 
  99. 文字颜色转换16进制转换成10进制 
  100. */ 
  101. preg_match_all("/([0-f]){2,2}/i",$this->FONT_COLOR,$MATCHES); 
  102. if(count($MATCHES)==3) 
  103. $this->RED=hexdec($MATCHES[0][0]); 
  104. $this->GREEN=hexdec($MATCHES[0][1]); 
  105. $this->BLUE=hexdec($MATCHES[0][2]); 
  106. //end of __construct 
  107. /* 
  108. 将16进制的颜色转换成10进制的(R,G,B) 
  109. */ 
  110. function hex2dec() 
  111. preg_match_all("/([0-f]){2,2}/i",$this->FONT_COLOR,$MATCHES); 
  112. if(count($MATCHES)==3) 
  113. $this->RED=hexdec($MATCHES[0][0]); 
  114. $this->GREEN=hexdec($MATCHES[0][1]); 
  115. $this->BLUE=hexdec($MATCHES[0][2]); 
  116. //缩放类型 
  117. function zoom_type($ZOOM_TYPE
  118. $this->ZOOM=$ZOOM_TYPE
  119. //对图片进行缩放,如果不指定高度和宽度就进行缩放 
  120. function zoom() 
  121. //缩放的大小 
  122. if($this->ZOOM==0) 
  123. $this->ZOOM_;gt;PICTURE_WIDTH * $this->ZOOM_MULTIPLE; 
  124. $this->ZOOM_HEIGHT=$this->PICTURE_HEIGHT * $this->ZOOM_MULTIPLE; 
  125. //新建一个真彩图象 
  126. $this->TRUE_COLOR=imagecreatetruecolor($this->ZOOM_WIDTH,$this->ZOOM_HEIGHT); 
  127. $WHITE=imagecolorallocate($this->TRUE_COLOR,255,255,255); 
  128. imagefilledrectangle($this->TRUE_COLOR,0,0,$this->ZOOM_WIDTH,$this->ZOOM_HEIGHT,$WHITE); 
  129. imagecopyresized($this->TRUE_COLOR,$this->PICTURE_CREATE,0,0,0,0,$this->ZOOM_WIDTH,$this->ZOOM_HEIGHT,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  130. //end of zoom 
  131. //裁切图片,按坐标或自动 
  132. function cut() 
  133. $this->TRUE_COLOR=imagecreatetruecolor($this->CUT_WIDTH,$this->CUT_WIDTH); 
  134. imagecopy($this->TRUE_COLOR,$this->PICTURE_CREATE, 0, 0, $this->CUT_X, $this->CUT_Y,$this->CUT_WIDTH,$this->CUT_HEIGHT); 
  135. //end of cut 
  136. /* 
  137. 在图片上放文字或图片 
  138. 水印文字 
  139. */ 
  140. function _mark_text() 
  141. $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  142. $this->WORD=mb_convert_encoding($this->FONT_WORD,'utf-8','gb2312'); 
  143. /* 
  144. 取得使用 TrueType 字体的文本的范围 
  145. */ 
  146. $TEMP = imagettfbbox($this->FONT_SIZE,0,$this->FONT_PATH,$this->WORD); 
  147. $WORD_LENGTH=strlen($this->WORD); 
  148. $WORD_WIDTH =$TEMP[2] - $TEMP[6]; 
  149. $WORD_HEIGHT =$TEMP[3] - $TEMP[7]; 
  150. /* 
  151. 文字水印的默认位置为右下角 
  152. */ 
  153. if($this->WORD_X==""
  154. $this->WORD_X=$this->PICTURE_WIDTH-$WORD_WIDTH
  155. if($this->WORD_Y==""
  156. $this->WORD_Y=$this->PICTURE_HEIGHT-$WORD_HEIGHT
  157. imagesettile($this->TRUE_COLOR,$this->PICTURE_CREATE); 
  158. imagefilledrectangle($this->TRUE_COLOR,0,0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT,IMG_COLOR_TILED); 
  159. $TEXT2=imagecolorallocate($this->TRUE_COLOR,$this->RED,$this->GREEN,$this->Blue); 
  160. imagettftext($this->TRUE_COLOR,$this->FONT_SIZE,$this->ANGLE,$this->WORD_X,$this->WORD_Y,$TEXT2,$this->FONT_PATH,$this->WORD); 
  161. /* 
  162. 水印图片 
  163. */ 
  164. function _mark_picture() 
  165. /* 
  166. 获取水印图片的信息 
  167. */ 
  168. @$SIZE=getimagesize($this->FORCE_URL); 
  169. if(!$SIZE
  170. exit($this->ERROR['unalviable']); 
  171. $FORCE_PICTURE_
  172. $FORCE_PICTURE_HEIGHT=$SIZE[1]; 
  173. //创建水印图片 
  174. switch($SIZE[2]) 
  175. case 1: 
  176. $FORCE_PICTURE_CREATE=imagecreatefromgif($this->FORCE_URL); 
  177. $FORCE_PICTURE_TYPE="gif"
  178. break
  179. case 2: 
  180. $FORCE_PICTURE_CREATE=imagecreatefromjpeg($this->FORCE_URL); 
  181. $FORCE_PICTURE_TYPE="jpg"
  182. break
  183. case 3: 
  184. $FORCE_PICTURE_CREATE=imagecreatefrompng($this->FORCE_URL); 
  185. $FORCE_PICTURE_TYPE="png"
  186. break
  187. /* 
  188. 判断水印图片的大小,并生成目标图片的大小,如果水印比图片大,则生成图片大小为水印图片的大小。否则生成的图片大小为原图片大小。 
  189. */ 
  190. $this->NEW_PICTURE=$this->PICTURE_CREATE; 
  191. if($FORCE_PICTURE_WIDTH>$this->PICTURE_WIDTH) 
  192. $CREATE_;gt;FORCE_START_X; 
  193. else 
  194. $CREATE_;gt;PICTURE_WIDTH; 
  195. if($FORCE_PICTURE_HEIGHT>$this->PICTURE_HEIGHT) 
  196. $CREATE_HEIGHT=$FORCE_PICTURE_HEIGHT-$this->FORCE_START_Y; 
  197. else 
  198. $CREATE_HEIGHT=$this->PICTURE_HEIGHT; 
  199. /* 
  200. 创建一个画布 
  201. */ 
  202. $NEW_PICTURE_CREATE=imagecreatetruecolor($CREATE_WIDTH,$CREATE_HEIGHT); 
  203. $WHITE=imagecolorallocate($NEW_PICTURE_CREATE,255,255,255); 
  204. /* 
  205. 将背景图拷贝到画布中 
  206. */ 
  207. imagecopy($NEW_PICTURE_CREATE$this->PICTURE_CREATE, 0, 0, 0, 0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  208. /* 
  209. 将目标图片拷贝到背景图片上 
  210. */ 
  211. imagecopy($NEW_PICTURE_CREATE$FORCE_PICTURE_CREATE$this->FORCE_X, $this->FORCE_Y, $this->FORCE_START_X, $this->FORCE_START_Y,$FORCE_PICTURE_WIDTH,$FORCE_PICTURE_HEIGHT); 
  212. $this->TRUE_COLOR=$NEW_PICTURE_CREATE
  213. //end of mark 
  214. function alpha_() 
  215. $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  216. $rgb="#CDCDCD"
  217. $tran_color="#000000"
  218. for($j=0;$j<=$this->PICTURE_HEIGHT-1;$j++) 
  219. for ($i=0;$i<=$this->PICTURE_WIDTH-1;$i++) 
  220. $rgb = imagecolorat($this->PICTURE_CREATE,$i,$j); 
  221. $r = ($rgb >> 16) & 0xFF; 
  222. $g = ($rgb >> 8) & 0xFF; 
  223. $b = $rgb & 0xFF; 
  224. $now_color=imagecolorallocate($this->PICTURE_CREATE,$r,$g,$b); 
  225. if ($now_color==$tran_color
  226. continue
  227. else 
  228. $color=imagecolorallocatealpha($this->PICTURE_CREATE,$r,$g,$b,$ALPHA); 
  229. imagesetpixel($this->PICTURE_CREATE,$ALPHA_X+$i,$ALPHA_Y+$j,$color); 
  230. $this->TRUE_COLOR=$this->PICTURE_CREATE; 
  231. /* 
  232. 图片旋转: 
  233. 沿y轴旋转 
  234. */ 
  235. function turn_y() 
  236. $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  237. for ($x = 0; $x < $this->PICTURE_WIDTH; $x++) 
  238. imagecopy($this->TRUE_COLOR, $this->PICTURE_CREATE, $this->PICTURE_WIDTH - $x - 1, 0, $x, 0, 1, $this->PICTURE_HEIGHT); 
  239. /* 
  240. 沿X轴旋转 
  241. */ 
  242. function turn_x() 
  243. $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  244. for ($y = 0; $y < $this->PICTURE_HEIGHT; $y++) 
  245. imagecopy($this->TRUE_COLOR, $this->PICTURE_CREATE, 0, $this->PICTURE_HEIGHT - $y - 1, 0, $y$this->PICTURE_WIDTH, 1); 
  246. /* 
  247. 任意角度旋转 
  248. */ 
  249. function turn() 
  250. $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  251. imageCopyResized($this->TRUE_COLOR,$this->PICTURE_CREATE,0,0,0,0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  252. $WHITE=imagecolorallocate($this->TRUE_COLOR,255,255,255); 
  253. $this->TRUE_COLOR=imagerotate ($this->TRUE_COLOR, $this->CIRCUMROTATE, $WHITE); 
  254. /* 
  255. 图片锐化 
  256. */ 
  257. function sharp() 
  258. $this->TRUE_COLOR=imagecreatetruecolor($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  259. $cnt=0; 
  260. for ($x=0; $x<$this->PICTURE_WIDTH; $x++) 
  261. for ($y=0; $y<$this->PICTURE_HEIGHT; $y++) 
  262. $src_clr1 = imagecolorsforindex($this->TRUE_COLOR, imagecolorat($this->PICTURE_CREATE, $x-1, $y-1)); 
  263. $src_clr2 = imagecolorsforindex($this->TRUE_COLOR, imagecolorat($this->PICTURE_CREATE, $x$y)); 
  264. $r = intval($src_clr2["red"]+$this->SHARP*($src_clr2["red"]-$src_clr1["red"])); 
  265. $g = intval($src_clr2["green"]+$this->SHARP*($src_clr2["green"]-$src_clr1["green"])); 
  266. $b = intval($src_clr2["blue"]+$this->SHARP*($src_clr2["blue"]-$src_clr1["blue"])); 
  267. $r = min(255, max($r, 0)); 
  268. $g = min(255, max($g, 0)); 
  269. $b = min(255, max($b, 0)); 
  270. if (($DST_CLR=imagecolorexact($this->PICTURE_CREATE, $r$g$b))==-1) 
  271. $DST_CLR = imagecolorallocate($this->PICTURE_CREATE, $r$g$b); 
  272. $cnt++; 
  273. if ($DST_CLR==-1) die("color allocate faile at $x, $y ($cnt)."); 
  274. imagesetpixel($this->TRUE_COLOR, $x$y$DST_CLR); 
  275. /* 
  276. 将图片反色处理?? 
  277. */ 
  278. function return_color() 
  279. /* 
  280. 创建一个画布 
  281. */ 
  282. $NEW_PICTURE_CREATE=imagecreate($this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  283. $WHITE=imagecolorallocate($NEW_PICTURE_CREATE,255,255,255); 
  284. /* 
  285. 将背景图拷贝到画布中 
  286. */ 
  287. imagecopy($NEW_PICTURE_CREATE$this->PICTURE_CREATE, 0, 0, 0, 0,$this->PICTURE_WIDTH,$this->PICTURE_HEIGHT); 
  288. $this->TRUE_COLOR=$NEW_PICTURE_CREATE
  289. /* 
  290. 生成目标图片并显示 
  291. */ 
  292. function show() 
  293. // 判断浏览器,若是IE就不发送头 
  294. if(isset($_SERVER['HTTP_USER_AGENT'])) 
  295. $ua = strtoupper($_SERVER['HTTP_USER_AGENT']); 
  296. if(!preg_match('/^.*MSIE.*/)$/i',$ua)) 
  297. header("Content-type:$this->PICTURE_MIME"); 
  298. $OUT=$this->PICTURE_TYPE; 
  299. $OUT($this->TRUE_COLOR); 
  300. /* 
  301. 生成目标图片并保存 
  302. */ 
  303. function save_picture() 
  304. // 以 JPEG 格式将图像输出到浏览器或文件 
  305. $OUT=$this->PICTURE_TYPE; 
  306. if(function_exists($OUT)) 
  307. // 判断浏览器,若是IE就不发送头 
  308. if(isset($_SERVER['HTTP_USER_AGENT'])) 
  309. $ua = strtoupper($_SERVER['HTTP_USER_AGENT']); 
  310. if(!preg_match('/^.*MSIE.*/)$/i',$ua)) 
  311. header("Content-type:$this->PICTURE_MIME"); 
  312. if(!$this->TRUE_COLOR) 
  313. exit($this->ERROR['unavilable']); 
  314. else 
  315. $OUT($this->TRUE_COLOR,$this->DEST_URL); 
  316. $OUT($this->TRUE_COLOR); 
  317. /* 
  318. 析构函数:释放图片 
  319. */ 
  320. function __destruct() 
  321. /*释放图片*/ 
  322. imagedestroy($this->TRUE_COLOR); 
  323. imagedestroy($this->PICTURE_CREATE); 
  324. //end of class 
  325. ?> 

希望本文所述对大家的php程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表