首页 > 开发 > PHP > 正文

PHP图像处理类库及演示分享

2024-05-04 23:35:17
字体:大 中 小
来源:转载
供稿:网友

近期需要做一些图像处理方面的学习和研究,首要任务就是选择一套合适的图像处理类库。于是参考其他类库自己编写了一个简单的,仅仅实现了指定文字内容创建图片(不支持中文)、创建验证码图片、创建缩略图,有需要的小伙伴可以参考下。

简单写了一个PHP的图像处理类库,虽然功能比较少,但是目前也没用到太高级的,以后用到了再填吧,或者哪位给点建议加上什么功能,或者有什么需求可以跟我说,我有时间加上,如果哪位对这个类库进行了扩展的话,还麻烦拿出来大家分享一下,代码现在是能用就行,考虑的东西不是很多,有什么更好的建议请告诉我,谢谢

Img.php

 

 
  1. <?php 
  2. /** 
  3. * Created by PhpStorm. 
  4. * User: MCtion 
  5. * Date: 2015/5/14 0014 
  6. * Time: 15:36 
  7. * 简单的图像类库,本类中所有相对路径均基于网站根目录,如需修改,则修改常量__WEBROOT__即可 
  8. * 功能:指定文字内容创建图片(不支持中文)、创建验证码图片、创建缩略图、其他功能待续 
  9. * 方法: 
  10. * Style(array $Options) 设置图片样式,每次设定前将重置为默认样式 
  11. * Create_Img_Png() 创建PNG图像,相关属性由Style指定 
  12. * Create_Img_Jpeg() 创建JPEG图像,相关属性由Style指定 
  13. * Create_Verify() 创建验证码图像,相关属性由Style指定 
  14. * Get_Verify() 获得创建的验证码值,MD5加密 
  15. * Load_Img(string $FilePath) 加载图像,创建图像源,供其他方法调用源,FilePath为图像相对路径 
  16. * Create_Thumb(string $FileName,string $FilePath) 创建由Load_Img()加载的图像的缩略图,FileName为保存后的图像前缀,FilePath为保存图像的相对路径,不包含文件名(例:/Uploads/images/Thumb/) 
  17. */ 
  18.  
  19. if(!defined("__WEBROOT__")) define("__WEBROOT__",$_SERVER['DOCUMENT_ROOT']); 
  20.  
  21. class Img { 
  22. protected $_Img; //图片源 
  23. protected $_FileImg; //加载的图片源 
  24. protected $_FileInfo; //加载的图片的信息数组 
  25. protected $_PicInfo; //加载的图片的宽高等信息数组 
  26. protected $_Rand = 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890'; //随机因子 
  27. protected $_Code = ''; //验证码 
  28. public $Width = 300;//图片默认宽 
  29. public $Height = 80; //图片默认高 
  30. public $BackgroundColor = "000000"; 
  31. public $Font = "/phps/Public/Font/ARIALNB.TTF"; //默认字体 
  32. public $FontSize = 16; //默认字体字号 
  33. public $FontColor = "ffffff"; //默认字体颜色 
  34. public $Content = "Test Word"; 
  35. public $Align = "left"; 
  36. public $Codes = 4; //验证码个数 
  37. public $Line = 6; //干扰线条的个数 
  38. public $LoadErr = ''; //错误信息 
  39.  
  40. //public function __construct(){} 
  41.  
  42. /** 设置图片属性 
  43. * @param array $Options 属性数组 
  44. * @return $this 返回对象 
  45. */ 
  46. public function Style($Options){ 
  47. $this -> _Re_Set(); 
  48. foreach($Options as $K=>$V){ 
  49. if(in_array($K,array('Width','Height','BackgroundColor','Font','FontSize','FontColor','Content','Align','Codes','Line','Snow'))){ 
  50. if($K == "BackgroundColor" || $K == "FontColor"){ 
  51. if(preg_match("#([a-zA-Z0-9]{6})#",$V)) $this -> $K = $V; 
  52. }else{ 
  53. $this -> $K = $V; 
  54. } 
  55. } 
  56. } 
  57. return $this; 
  58. } 
  59.  
  60. /** 
  61. * 重置属性,不提供外部访问 
  62. */ 
  63. protected function _Re_Set(){ 
  64. $this -> Width = 100; 
  65. $this -> Height = 30; 
  66. $this -> BackgroundColor = "000000"; 
  67. $this -> Font = "/phps/Public/Font/ARIALNB.TTF"; 
  68. $this -> FontSize = 16; 
  69. $this -> FontColor = "ffffff"; 
  70. $this -> Align = "left"; 
  71. $this -> Codes =4; 
  72. $this -> Line = 6; 
  73. } 
  74.  
  75. /** 
  76. * 创建图像源、添加背景、创建图像 
  77. * @param bool $BGC 指定是否创建背景色及矩形块 
  78. */ 
  79. protected function _Create_Img_GB($BGC = True){ 
  80. $this -> _Img = imagecreatetruecolor($this -> Width,$this -> Height); //创建背景源 
  81. if($BGC){ 
  82. preg_match("#([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})#",$this -> BackgroundColor,$ColorArr); //将颜色值分隔成三组16位进制数 
  83. $Color = imagecolorallocate($this -> _Img,hexdec($ColorArr[1]),hexdec($ColorArr[2]),hexdec($ColorArr[3])); //给Img图像源添加背景色 
  84. imagefilledrectangle($this -> _Img,0,$this -> Height,$this -> Width,0,$Color); //创建图像 
  85. } 
  86. } 
  87.  
  88. /** 
  89. * 创建随机验证码 
  90. */ 
  91. protected function _Create_Code(){ 
  92. $Len = strlen($this -> _Rand) - 1; 
  93. for($i = 0;$i < $this -> Codes;$i++){ 
  94. $this -> _Code .= $this -> _Rand[mt_rand(0,$Len)]; 
  95. } 
  96. } 
  97.  
  98. /** 
  99. * 向图像中写入字符串,暂不支持中文 
  100. */ 
  101. protected function _Write_Text(){ 
  102. $FontWidth = imagefontwidth($this -> FontSize); //获取字号的一个字符的宽度 
  103. preg_match_all('/(.)/us', $this -> Content, $TextArr); //将内容分隔成数组一遍统计个数 
  104. $FontHeight = imagefontheight($this -> FontSize); //获取字号的高度 
  105. $X = ceil(($this -> Width - ($FontWidth * count($TextArr[0]))) / 2); //设置X轴距左边距的距离 
  106. $Y = ceil(($this -> Height + $FontHeight) / 2); //设置Y轴距上边距的距离 
  107. preg_match("#([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})#",$this -> FontColor,$ColorArr); 
  108. $Color = imagecolorallocate($this -> _Img,hexdec($ColorArr[1]),hexdec($ColorArr[2]),hexdec($ColorArr[3])); //设置文字颜色 
  109. imagettftext($this -> _Img,$this -> FontSize,0,$X,$Y,$Color,__WEBROOT__.$this -> Font,$this -> Content); //写入内容 
  110. } 
  111.  
  112. /** 
  113. * 向图像中写入验证码 
  114. */ 
  115. protected function _Write_Code(){ 
  116. $_X = $this -> Width / $this -> Codes; //设置宽高比 
  117. for($i = 0;$i < $this -> Codes;$i++){ //循环Codes次,每次生成一位验证码值 
  118. $Color = imagecolorallocate($this -> _Img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156)); //随机生成验证码值的颜色 
  119. imagettftext($this -> _Img,$this -> FontSize,mt_rand(-30,30),$_X*$i+mt_rand(1,5),$this -> Height / 1.3,$Color,__WEBROOT__.$this -> Font,$this -> _Code[$i]); //生成一位验证码值 
  120. } 
  121. } 
  122.  
  123. /** 
  124. * 向图像中写入干扰线条 
  125. */ 
  126. protected function _Write_Line() { //生成干扰线条 
  127. for ($i=0;$i < $this -> Line;$i++) { 
  128. $Color = imagecolorallocate($this -> _Img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156)); 
  129. imageline($this -> _Img,mt_rand(0,$this -> Width),mt_rand(0,$this -> Height),mt_rand(0,$this -> Width),mt_rand(0,$this -> Height),$Color); 
  130. } 
  131. } 
  132.  
  133. /** 
  134. * 设置图像类型为JPEG 
  135. */ 
  136. protected function _Img_Jpeg(){ 
  137. header('Content-type:image/jpeg'); 
  138. imagejpeg($this -> _Img); 
  139. imagedestroy($this -> _Img); 
  140. } 
  141.  
  142. /** 
  143. * 设置图像类型为PNG 
  144. */ 
  145. protected function _Img_Png(){ 
  146. header('Content-type:image/png'); 
  147. imagepng($this -> _Img); 
  148. imagedestroy($this -> _Img); 
  149. } 
  150.  
  151. /** 
  152. * 创建JPEG的字符串图像 
  153. */ 
  154. public function Create_Img_Jpg(){ 
  155. $this -> _Create_Img_GB(True); 
  156. $this -> _Write_Text(); 
  157. $this -> _Img_Jpeg(); 
  158. } 
  159.  
  160. /** 
  161. * 创建PNG的字符串图像 
  162. */ 
  163. public function Create_Img_Png(){ 
  164. $this -> _Create_Img_GB(True); 
  165. $this -> _Write_Text(); 
  166. $this -> _Img_Png(); 
  167. } 
  168.  
  169. /** 
  170. * 创建验证码的PNG图像 
  171. */ 
  172. public function Create_Verify(){ 
  173. $this -> BackgroundColor = ''; 
  174. for($I = 0;$I < 3;$I++){ 
  175. $this -> BackgroundColor .= dechex(mt_rand(20,155)); 
  176. } 
  177. $this -> _Create_Img_GB(True); 
  178. $this -> _Create_Code(); 
  179. $this -> _Write_Line(); 
  180. $this -> _Write_Code(); 
  181. $this -> _Img_Png(); 
  182. } 
  183.  
  184. /** 
  185. * 外部获取MD5加密后的验证码 
  186. * @return string 
  187. */ 
  188. public function Get_Verify(){ 
  189. return md5($this -> _Code); 
  190. } 
  191.  
  192. /** 
  193. * 加载一个图像文件,并获取图像相关信息 
  194. * @param string $FilePath 图像相对路径地址 
  195. * @return $this|bool 成功返回对象,否则返回FALSE 
  196. */ 
  197. public function Load_Img($FilePath){ 
  198. $FilePath = __WEBROOT__.$FilePath; 
  199. if(!is_file($FilePath)){ 
  200. $this -> LoadErr = "路径错误,文件不存在"; 
  201. Return False; 
  202. } 
  203. $this -> _PicInfo = getimagesize($FilePath); 
  204. $this -> _FileInfo = pathinfo($FilePath); 
  205. switch($this -> _PicInfo[2]){ 
  206. case 1:$this ->_FileImg = imagecreatefromgif($FilePath);break; 
  207. case 2:$this ->_FileImg = imagecreatefromjpeg($FilePath);break; 
  208. case 3:$this ->_FileImg = imagecreatefrompng($FilePath);break; 
  209. default:$this -> LoadErr = "类型错误,不支持的图片类型";Return False; 
  210. } 
  211. Return True; 
  212. } 
  213.  
  214. /** 
  215. * 创建缩略图 
  216. * @param string $FileName 保存的图片名称前缀 
  217. * @param string $FilePath 保存图片的相对路径 
  218. * @return mixed 返回生成的图片的信息数组 
  219. */ 
  220. public function Create_Thumb($FileName,$FilePath){ 
  221. $SavePath = __WEBROOT__.$FilePath; 
  222. if(!file_exists($SavePath)){ 
  223. mkdir($SavePath,0777,true); 
  224. } 
  225. $FileName = $FileName.date("YmdHis").rand(100,999).'.'.$this -> _FileInfo['extension']; 
  226. $FilePath = $FilePath.$FileName; 
  227. $SavePath = $SavePath.$FileName; 
  228. $this -> _Create_Img_GB(False); 
  229. imagecopyresampled($this -> _Img,$this -> _FileImg,0,0,0,0,$this -> Width,$this -> Height,$this -> _PicInfo[0],$this -> _PicInfo[1]); 
  230. switch($this -> _PicInfo[2]){ 
  231. case 1:imagegif($this -> _Img,$SavePath);break; 
  232. case 2:imagejpeg($this -> _Img,$SavePath);break; 
  233. case 3:imagepng($this -> _Img,$SavePath);break; 
  234. } 
  235. $FIleInfo['FileName'] = $FileName; 
  236. $FIleInfo['FilePath'] = $FilePath; 
  237. Return $FIleInfo; 
  238. } 
  239. } 

使用示例

 

 
  1. $Img = new Img(); 
  2.  
  3. $Options['Width'] = 300; 
  4. $Options['Height'] = 100; 
  5. $Options['Content'] = "Test Create Img"; 
  6. $Options['FontColor'] = "FF0000"; 
  7. $Options['BackgroundColor'] = "AAAAAA"; 
  8. $Img -> Style($Options) -> Create_Img_Jpg(); 
  9.  
  10. if($Img -> Load_Img("/Public/images/ad1.png")){ 
  11. $FileInfo = $Img -> Style(array('Width'=>30,'Height'=>30)) -> Create_Thumb("Thumb","/Uploads/images/"); 
  12. var_dump($FileInfo); 
  13. }else{ 
  14. die("加载图像失败,".$Img -> LoadErr); 
  15. } 

以上所述就是本文的全部内容了,希望大家能够喜欢。

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