首页 > php图像处理 > php 中文验证码生成与调用方法

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

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

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

$ch_str="你要生成中文验证码汉字"; 
$str=array(); 
for ($i=0;$i<strlen($ch_str);$i+=3) 
{ 
$str[]=$ch_str[$i].$ch_str[$i+1].$ch_str[$i+2]; 
} 
//图片的长和高 
$image_x=200; 
$image_y=100; 
$im = imagecreate($image_x,$image_y); 
//这里取图片底色为白色 
$bkg = imagecolorallocate($im,255,255,255); 
//显示的字体样式,这个要把文件放到对应的目录中,如果你没有文件就去window的字体文件中找一个吧。 
$fnt = "simfang.ttf"; 
//为图像分配一些颜色 
$white=imagecolorallocate($im,234,185,95); 
//在图片上画椭圆弧,指定下坐标点 
imagearc($im, 150, 8, 20, 20, 75, 170, $white); 
imagearc($im, 180, 7,50, 30, 75, 175, $white); 
//在图片上画一条线段,指定下坐标点 
imageline($im,20,20,180,30,$white); 
imageline($im,20,18,170,50,$white); 
imageline($im,25,50,80,50,$white); 
//乱点的数量 
$noise_num=3000; 
$line_num=80; 
//各种混乱字符的颜色 
$rectangle_color=imagecolorallocate($im,0xaa,0xaa,0xaa); 
$noise_color=imagecolorallocate($im,0x00,0x00,0x00); 
$font_color=imagecolorallocate($im,0x00,0x00,0x00); 
for($i=0;$i<$noise_num;$i++) 
{ 
//在一个坐标点上画一个单一像素,这个点上面定义了,是黑色的。 
imagesetpixel($im,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color); 
} 
 
for($i=0;$i<$line_num;$i++) 
{ 
$line_color=imagecolorallocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); 
//在两个坐标点间画一条线,颜色在上面定义 
imageline($im,mt_rand(0,$image_x),mt_rand(0,$image_y),mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color);     
} 
$randnum=rand(0,count($str)-4); 
//保持是偶数 
if ($randnum%2) 
{ 
$randnum+=1;     
} 
$str1=$str[$randnum].$str[$randnum+1]; 
for ($i=0;$i<2;$i++) 
{ 
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]);     
} 
imagepng($im); 
imagedestroy($im); 
 
//生成中文验证码二 
$str="中文汉字"; 
$image_x=110;  
$image_y=110;  
$im = imagecreate($image_x,$image_y);  
$bkg = imagecolorallocate($im,255,255,255);  
$fnt = "hb.ttf"; //显示的字体样式  
$white=imagecolorallocate($im,234,185,95);  
imagearc($im, 150, 8, 20, 20, 75, 170, $white);  
imagearc($im, 180, 7,50, 30, 75, 175, $white);  
imageline($im,20,20,180,30,$white);  
imageline($im,20,18,170,50,$white);  
imageline($im,25,50,80,50,$white);  
$noise_num=3000;  
$line_num=80;  
imagecolorallocate($im,0xff,0xff,0xff);  
$rectangle_color=imagecolorallocate($im,0xaa,0xaa,0xaa);  
$noise_color=imagecolorallocate($im,0x00,0x00,0x00);  
$font_color=imagecolorallocate($im,0x00,0x00,0x00);  
$line_color=imagecolorallocate($im,0x00,0x00,0x00);  
for($i=0;$i<$noise_num;$i++)  
imagesetpixel($im,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color);  
for($i=0;$i<$line_num;$i++)  
imageline($im,mt_rand(0,$image_x),mt_rand(0,$image_y),mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color);  
$randnum=rand(0,strlen($str)-4);  
if ($randnum%2)$randnum+=1;  
$str1=substr($str,$randnum,4);  
$str2 = iconv("gb2312","utf-8",$str1);//验证汉字在$str1里面 
 
imagettftext($im, rand(28,32), rand(0,70), rand(25,27), rand(70,100), $font_color, $fnt, $str2);  
imagepng($im);  
imagedestroy($im); 
 
//把汉字放在数组 
/* 
gd函数只接受utf8格式编码的文字,所以在写文字前首先要进行编码转换。php自带的iconv和mbstring库都可以完成这项工作 
*/ 
 
$randcode=array('宠'); 
$codetable=array(); 
$fp=fopen("gb2312.txt","r"); 
while($line=fgets($fp)) 
$codetable[hexdec(substr($line,0,6))]=substr($line,7,6); 
fclose($fp);  
 
//gb2312转utf8 
function gb2utf8($gbstr)  
{ 
global $codetable; 
if(trim($gbstr)=="") 
return $gbstr; 
$ret=""; 
$utf8=""; 
while($gbstr) 
{ 
if(ord(substr($gbstr,0,1))>127) 
{ 
$thisw=substr($gbstr,0,2); 
$gbstr=substr($gbstr,2,strlen($gbstr)); 
$utf8=""; 
@$utf8=u2utf8(hexdec($codetable[hexdec(bin2hex($thisw))-0x8080])); 
 
  
 
if($utf8!="") 
for($i=0;$i<strlen($utf8);$i+=3) 
$ret.=chr(substr($utf8,$i,3)); 
} 
else 
{ 
$ret.=substr($gbstr,0,1); 
$gbstr=substr($gbstr,1,strlen($gbstr)); 
} 
} 
return $ret; 
}   
  
 
//unicode转utf8 
function u2utf8($c) 
{ 
$str=""; 
if($c<0x80) 
$str.=$c; 
elseif($c<0x800) 
{ 
$str.=(0xc0|$c>>6); 
$str.=(0x80|$c&0x3f); 
} 
elseif($c<0x10000) 
{ 
$str.=(0xe0|$c>>12); 
$str.=(0x80|$c>>6&0x3f); 
$str.=(0x80|$c&0x3f); 
} 
elseif($c<0x200000) 
{ 
$str.=(0xf0|$c>>18); 
$str.=(0x80|$c>>12&0x3f); 
 
  
 
$str.=(0x80|$c>>6&0x3f); 
$str.=(0x80|$c&0x3f); 
} 
return $str; 
}  
 
//生成附加码 
function create_excode($length) 
{ 
 global $randcode; 
header("content-type: image/png"); 
 $image_x=$length*30;    //图片宽度 
 $image_y=40;            //图片高度 
$noise_num=80*$length;   //杂点数量 
$line_num=$length-2;      //干扰线数量 
 $image=imagecreate($image_x,$image_y); 
 imagecolorallocate($image,0xff,0xff,0xff);                  //设定背景颜色 
 $rectangle_color=imagecolorallocate($image,0xaa,0xaa,0xaa); //边框颜色 
 $noise_color=imagecolorallocate($image,0x00,0x00,0x00);     //杂点颜色 
 $font_color=imagecolorallocate($image,0x00,0x00,0x00);      //字体颜色  
 $line_color=imagecolorallocate($image,0x33,0x33,0x33);      //干扰线颜色 
 
 //加入杂点 
for($i=0;$i<$noise_num;$i++) 
  imagesetpixel($image,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color); 
 
 $font_face="simkai.ttf";    //字体 
$x=2; 
$session_code=''; 
for($i=0;$i<$length;$i++) 
{ 
$code=$randcode[mt_rand(0,count($randcode)-1)]; 
 imagettftext($image,18,mt_rand(-6,6),$x,29,$font_color,$font_face,gb2utf8($code)); 
$x+=30; 
$session_code.=$code; 
} 
@session_start(); 
$_session['excode']=$session_code;  //把附加码的值放在session中 
 
  
//加入干扰线 
for($i=0;$i<$line_num;$i++) 
 imageline($image,mt_rand(0,$image_x),mt_rand(0,$image_y), 
mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color); 
 imagerectangle($image,0,0,$image_x-1,$image_y-1,$rectangle_color);  //加个边框 
 imagepng($image); 
 imagedestroy($image); 
}
create_excode(6);

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


本文地址:http://www.phprm.com/tuxiang/fs4460.html

转载随意,但请附上文章地址:-)

标签:php 中文验证码 生成调用

相关文章

发表留言