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

 

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

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

分享到: