首页 > 开发 > PHP > 正文

功能强大的PHP图片处理类(水印、透明度、旋转)

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

这篇文章主要汇总介绍了php图片处理类(水印、透明度、缩放、锐化),非常的简单实用,有需要的小伙伴可以参考下

非常强大的php图片处理类,可以自定义图片水印、透明度、图片缩放、图片锐化、图片旋转、图片翻转、图片剪切、图片反色。

* 图片处理函数功能:缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色

* 处理并保存历史记录的思路:当有图片有改动时自动生成一张新图片,命名方式可以考虑在原图片的基础上加上步骤,例如:图片名称+__第几步

具体代码如下:

 

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

这就是非常强大的php图片处理类,好好收藏,亲,相信以后一定会派上用场的。

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