当前位置:首页 > PHP教程 > php图像处理 > 列表

php 中文验证码生成与调用方法

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-19 14:16:57 浏览: 评论:0 

在php中要生成中文验证码就必须做与生成验证验证码不一样的操作,因为GD函数只接受UTF8格式编码的文字,所以在用php生成中文验证码时面要前首先要进行编码转换,操作php的iconv可以实例.

php 中文验证码生成与调用方法,代码如下:

  1. $ch_str="你要生成中文验证码汉字"
  2. $str=array(); 
  3. for ($i=0;$i<strlen($ch_str);$i+=3) 
  4.     $str[]=$ch_str[$i].$ch_str[$i+1].$ch_str[$i+2]; 
  5. //图片的长和高 
  6. $image_x=200; 
  7. $image_y=100; 
  8. $im = imagecreate($image_x,$image_y); 
  9. //这里取图片底色为白色 
  10. $bkg = imagecolorallocate($im,255,255,255); 
  11. //显示的字体样式,这个要把文件放到对应的目录中,如果你没有文件就去window的字体文件中找一个吧。 
  12. $fnt = "simfang.ttf"
  13. //为图像分配一些颜色 
  14. $white=imagecolorallocate($im,234,185,95); 
  15. //在图片上画椭圆弧,指定下坐标点 
  16. imagearc($im, 150, 8, 20, 20, 75, 170, $white); 
  17. imagearc($im, 180, 7,50, 30, 75, 175, $white); 
  18. //在图片上画一条线段,指定下坐标点 
  19. imageline($im,20,20,180,30,$white); 
  20. imageline($im,20,18,170,50,$white); 
  21. imageline($im,25,50,80,50,$white); 
  22. //乱点的数量 
  23. $noise_num=3000; 
  24. $line_num=80; 
  25. //各种混乱字符的颜色 
  26. $rectangle_color=imagecolorallocate($im,0xaa,0xaa,0xaa); 
  27. $noise_color=imagecolorallocate($im,0x00,0x00,0x00); 
  28. $font_color=imagecolorallocate($im,0x00,0x00,0x00); 
  29. for($i=0;$i<$noise_num;$i++) 
  30.     //在一个坐标点上画一个单一像素,这个点上面定义了,是黑色的。 
  31.     imagesetpixel($im,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color); 
  32.  
  33. for($i=0;$i<$line_num;$i++) 
  34.     $line_color=imagecolorallocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); 
  35.     //在两个坐标点间画一条线,颜色在上面定义 
  36.     imageline($im,mt_rand(0,$image_x),mt_rand(0,$image_y),mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color);     
  37. $randnum=rand(0,count($str)-4); 
  38. //保持是偶数 
  39. if ($randnum%2) 
  40.     $randnum+=1;     
  41. $str1=$str[$randnum].$str[$randnum+1]; 
  42. for ($i=0;$i<2;$i++) 
  43.     imagettftext($im, rand(28,32), rand(0,70), rand(($image_x/4)*$i+$image_x/10,($image_x/4)*$i+$image_x/8), rand($image_y/2+$image_y/10,$image_y/2+$image_y/5), $font_color$fnt$str[$randnum+$i]);     
  44. imagepng($im); 
  45. imagedestroy($im); 
  46.  
  47. //生成中文验证码二 
  48. $str="中文汉字"
  49. $image_x=110;  
  50. $image_y=110;  
  51. $im = imagecreate($image_x,$image_y);  
  52. $bkg = imagecolorallocate($im,255,255,255);  
  53. $fnt = "hb.ttf"//显示的字体样式  
  54. $white=imagecolorallocate($im,234,185,95);  
  55. imagearc($im, 150, 8, 20, 20, 75, 170, $white);  
  56. imagearc($im, 180, 7,50, 30, 75, 175, $white);  
  57. imageline($im,20,20,180,30,$white);  
  58. imageline($im,20,18,170,50,$white);  
  59. imageline($im,25,50,80,50,$white);  
  60. $noise_num=3000;  
  61. $line_num=80;  
  62. imagecolorallocate($im,0xff,0xff,0xff);  
  63. $rectangle_color=imagecolorallocate($im,0xaa,0xaa,0xaa);  
  64. $noise_color=imagecolorallocate($im,0x00,0x00,0x00);  
  65. $font_color=imagecolorallocate($im,0x00,0x00,0x00);  
  66. $line_color=imagecolorallocate($im,0x00,0x00,0x00);  
  67. for($i=0;$i<$noise_num;$i++)  
  68. imagesetpixel($im,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color);  
  69. for($i=0;$i<$line_num;$i++)  
  70. imageline($im,mt_rand(0,$image_x),mt_rand(0,$image_y),mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color);  
  71. $randnum=rand(0,strlen($str)-4);  
  72. if ($randnum%2)$randnum+=1;  
  73. $str1=substr($str,$randnum,4);  
  74. $str2 = iconv("gb2312","utf-8",$str1);//验证汉字在$str1里面 
  75.  
  76. imagettftext($im, rand(28,32), rand(0,70), rand(25,27), rand(70,100), $font_color$fnt$str2);  
  77. imagepng($im);  
  78. imagedestroy($im); 
  79.  
  80. //把汉字放在数组 
  81. /* 
  82. gd函数只接受utf8格式编码的文字,所以在写文字前首先要进行编码转换。php自带的iconv和mbstring库都可以完成这项工作 
  83. */ 
  84.  
  85. $randcode=array('宠'); 
  86. $codetable=array(); 
  87. $fp=fopen("gb2312.txt","r"); 
  88. while($line=fgets($fp)) 
  89.     $codetable[hexdec(substr($line,0,6))]=substr($line,7,6); 
  90. fclose($fp);  
  91.  
  92. //gb2312转utf8 
  93. function gb2utf8($gbstr)  
  94.     global $codetable
  95.     if(trim($gbstr)==""
  96.         return $gbstr
  97.     $ret=""
  98.     $utf8=""
  99.     while($gbstr
  100.     { 
  101.         if(ord(substr($gbstr,0,1))>127) 
  102.         { 
  103.             $thisw=substr($gbstr,0,2); 
  104.             $gbstr=substr($gbstr,2,strlen($gbstr)); 
  105.             $utf8=""
  106.             @$utf8=u2utf8(hexdec($codetable[hexdec(bin2hex($thisw))-0x8080])); 
  107.  
  108.   
  109.  
  110.             if($utf8!=""
  111.             for($i=0;$i<strlen($utf8);$i+=3) 
  112.                 $ret.=chr(substr($utf8,$i,3)); 
  113.         } 
  114.         else 
  115.         { 
  116.             $ret.=substr($gbstr,0,1); 
  117.             $gbstr=substr($gbstr,1,strlen($gbstr)); 
  118.         } 
  119.     } 
  120.     return $ret
  121. }   
  122.   
  123.  
  124. //unicode转utf8 
  125. function u2utf8($c
  126.     $str=""
  127.     if($c<0x80) 
  128.         $str.=$c
  129.     elseif($c<0x800) 
  130.     { 
  131.         $str.=(0xc0|$c>>6); 
  132.         $str.=(0x80|$c&0x3f); 
  133.     } 
  134.     elseif($c<0x10000) 
  135.     { 
  136.         $str.=(0xe0|$c>>12); 
  137.         $str.=(0x80|$c>>6&0x3f); 
  138.         $str.=(0x80|$c&0x3f); 
  139.     } 
  140.     elseif($c<0x200000) 
  141.     { 
  142.         $str.=(0xf0|$c>>18); 
  143.         $str.=(0x80|$c>>12&0x3f); 
  144.  
  145.   
  146.  
  147.         $str.=(0x80|$c>>6&0x3f); 
  148.         $str.=(0x80|$c&0x3f); 
  149.     } 
  150.     return $str
  151. }  
  152.  
  153. //生成附加码 
  154. function create_excode($length
  155.  global $randcode
  156.     header("content-type: image/png"); 
  157.  $image_x=$length*30;    //图片宽度 
  158.  $image_y=40;            //图片高度 
  159.     $noise_num=80*$length;   //杂点数量 
  160.     $line_num=$length-2;      //干扰线数量 
  161.  $image=imagecreate($image_x,$image_y); 
  162.  imagecolorallocate($image,0xff,0xff,0xff);                  //设定背景颜色 
  163.  $rectangle_color=imagecolorallocate($image,0xaa,0xaa,0xaa); //边框颜色 
  164.  $noise_color=imagecolorallocate($image,0x00,0x00,0x00);     //杂点颜色 
  165.  $font_color=imagecolorallocate($image,0x00,0x00,0x00);      //字体颜色  
  166.  $line_color=imagecolorallocate($image,0x33,0x33,0x33);      //干扰线颜色 
  167.  
  168.  //加入杂点 
  169.     for($i=0;$i<$noise_num;$i++) 
  170.   imagesetpixel($image,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color); 
  171.  
  172.  $font_face="simkai.ttf";    //字体 
  173.     $x=2; 
  174.     $session_code=''
  175.     for($i=0;$i<$length;$i++) 
  176.     { 
  177.         $code=$randcode[mt_rand(0,count($randcode)-1)]; 
  178.      imagettftext($image,18,mt_rand(-6,6),$x,29,$font_color,$font_face,gb2utf8($code)); 
  179.         $x+=30; 
  180.         $session_code.=$code
  181.     } 
  182.     @session_start(); 
  183.     $_session['excode']=$session_code;  //把附加码的值放在session中 
  184.  
  185.   
  186.     //加入干扰线 
  187.     for($i=0;$i<$line_num;$i++) 
  188.      imageline($image,mt_rand(0,$image_x),mt_rand(0,$image_y), 
  189.                     mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color); 
  190.  imagerectangle($image,0,0,$image_x-1,$image_y-1,$rectangle_color);  //加个边框 
  191.  imagepng($image); 
  192.  imagedestroy($image); 
  193. }//开源代码phpfensi.com 
  194. create_excode(6); 

 

使用的时候直接用html语法:<img src="excode.php">调用就可以了,在服务端做验证时取session存储的验证字符与用户提交的字符进行比较,相同则通过验证.

Tags: php 中文验证码 生成调用

分享到: