首页 > 语言 > PHP > 正文

PHP验证码例子(带刷新)DEMO_PHP图片验证码类实例

2024-09-04 11:44:39
字体:
来源:转载
供稿:网友

验证码这样的功能可以说是无处不在了、那使用php来实现验证码这样的功能呢?接下来我就将验证码实现封装到一个类里面独立出来、那么后面如果再使用到验证码功能。

直接引入该类文件并创建该类的实例、就可以使用验证码了,验证码类文件vcode.class.php代码如下:

  1. //验证码类 
  2. class Vcode{ 
  3. private $width;//图片宽度 
  4. private $height;//图片高度 
  5. private $num;//验证码个数 
  6. private $img;//图片资源 
  7. private $code;//验证码 
  8. private $pointNum;//干扰点个数 
  9. private $lineNum;//干扰线个数 
  10. private $fontFile;//字体文件 
  11.  
  12. //构造函数初始化相关数据 
  13. function __construct($width=85,$height=34,$num=4){ 
  14. $this->width=$width
  15. $this->height=$height
  16. $this->num=$num
  17. $this->code=$this->createCode(); 
  18. $this->pointNum=100; 
  19. $this->lineNum=10; 
  20. $this->fontFile="<a href="http://dwtedx.com/font/无"  
  21. target="_blank" class="keylink">STL</a>ITI.TTF"; 
  22.  
  23. //用于设置成员属性 
  24. //@param string $key 成员属性名 
  25. //@param mixed $value 成员属性值 
  26. //@return object 返回自己对象$this,可用于连贯操作 
  27. public function set($key,$val){ 
  28. //get_class_vars() 获取类中的属性组成的数组 
  29. //get_class() 返回对象的类名 
  30. if(array_key_exists($key,get_class_vars(get_class($this)))){ 
  31. $this->setOption($key,$val); 
  32. return $this
  33. //设置参数 
  34. private function setOption($key,$value){ 
  35. $this->$key=$value
  36.  
  37. //获取验证码 
  38. public function getCode(){ 
  39. return $this->code; 
  40.  
  41. //输出图像 
  42. public function outImg(){ 
  43. //创建图像 
  44. $this->createImage(); 
  45. //画验证码 
  46. $this->drawCode(); 
  47. //画干扰元素 
  48. $this->drawDisturbColor(); 
  49. //输出图像 
  50. $this->printImg(); 
  51.  
  52. //画验证码 
  53. private function drawCode(){ 
  54. $this->fontFile="./font/".$this->fontFile; 
  55. for($i=0;$i<$this->num;$i++){ 
  56. //设置随机颜色 
  57. $randColor=imagecolorallocate($this->img,rand(0,128) 
  58. ,rand(0,128),rand(0,128)); 
  59. //字体大小 
  60. $fontSize=rand(20,23); 
  61. //字体水平位置 
  62. $x=($this->width/$this->num)*$i
  63. //水平方向的位置 
  64. $y=rand($fontSize,imagefontheight($fontSize)+3); 
  65. //画字体 
  66. imagettftext($this->img,$fontSize,0,$x,$y,$randColor
  67. $this->fontFile,$this->code{$i}); 
  68.  
  69. //画干扰元素 
  70. private function drawDisturbColor(){ 
  71. //画干扰点 
  72. for($i=0;$i<$this->pointNum;$i++){ 
  73. //设置随机颜色 
  74. $randColor=imagecolorallocate($this->img,rand(0,255), 
  75. rand(0,255),rand(0,255)); 
  76. //画点 
  77. imagesetpixel($this->img,rand(1,$this->width-2),rand(1, 
  78. $this->height-2),$randColor); 
  79. //画干扰线 
  80. for($i=0;$i<$this->lineNum;$i++){ 
  81. //设置随机颜色 
  82. $randColor=imagecolorallocate($this->img,rand(0,200), 
  83. rand(0,200),rand(0,200)); 
  84. //画线 
  85. imageline($this->img,rand(1,$this->width-2),rand(1, 
  86. $this->height-2),rand(1,$this->height-2), 
  87. rand(1,$this->width-2),$randColor); 
  88.  
  89. //创建图像 
  90. private function createImage(){ 
  91. //创建一个真彩色图像 
  92. $this->img=imagecreatetruecolor($this->width,$this->height); 
  93. //设置背景色 
  94. $bgColor=imagecolorallocate($this->img,rand(200,255), 
  95. rand(200,255),rand(200,255)); 
  96. //填充背景色 
  97. imagefill($this->img,0,0,$bgColor); 
  98. //设置边框颜色 
  99. $borderColor=imagecolorallocate($this->img,0,0,0); 
  100. //画一个边框 
  101. imagerectangle($this->img,0,0,$this->width-1, 
  102. $this->height-1,$borderColor); 
  103.  
  104. //输出图像 
  105. private function printImg(){ 
  106. if(imagetypes() & IMG_PNG){ 
  107. //针对png 
  108. header("Content-Type:image/png"); 
  109. imagepng($this->img); 
  110. }else if(imagetypes() & IMG_JPG){ 
  111. //针对jpg 
  112. header("Content-Type:image/jpeg"); 
  113. imagejpeg($this->img,null,100); 
  114. }else if(imagetypes() & IMG_GIF){ 
  115. //针对Gif 
  116. header("Content-Type:image/gif"); 
  117. imagegif($this->img); 
  118. }else if(imagetypes() & IMG_WBMP){ 
  119. // 针对 WBMP 
  120. header(′Content-Type: image/vnd.wap.wbmp′); 
  121. imagewbmp($this->img); 
  122. }else
  123. die(′No image support in this PHP server′); 
  124.  
  125. //创建验证码 
  126. private function createCode(){ 
  127. //默认字符串 
  128. $codes="123456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXY"
  129. //生成验证码 
  130. $code=""
  131. for($i=0;$i<$this->num;$i++){ 
  132. $code.=$codes{rand(0,strlen($codes)-1)}; 
  133. //Vevb.com 
  134. return $code
  135.  
  136. //析构函数用于销毁图像资源 
  137. function __destruct(){ 
  138. imagedestroy($this->img); 

这里我使用的画字体的函数是imagettftext()、因为这个函数可以自定义字体样式、从代码中也能看出来

传入的参数有个字体文件属性、如果不喜欢用这个函数可以使用imagestring()函数也行

只不过个人觉得这个函数的默认字体大小、也不好看、还是自定义字体看着舒服点

调用验证码类image_002.php代码如下:

  1. //开启Sessionsession_start();//引入验证码类include("vcode.class.php");//创建验证码类$vcode=new Vcode();//将获取的验证码存入到session中$_SESSION[′code′]=$vcode->getCode();//$vcode->set("pointNum",10);//自定义干扰点个数//$vcode->set("lineNum",10);//自定义干扰线个数//$vcode->set("fontFile","wawa.ttf");//自定义字体文件//输出图像$vcode->outImg(); 

HTML代码如下:

  1. <img src="image_002.php" onclick="this.src=′image_002.php?Math.random()′"/> 

到这里整个功能就做完了、希望对一些哥们有用、同时也当自己做个笔记

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