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

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

这里我使用的画字体的函数是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()′"/>

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