**
个人博客开通啦!功能正在逐步完善中,大家可以访问http://www.codeliu.com
**
验证码在生活中随处可见,那么如何实现验证码呢?实现这样的功能对于大佬来说当然是像呼吸一样自然,但对于一些像我一样的刚入门的小白来说,还是有一点困难的。那么下面就来说说我的方法。
主要使用了PHP的GD库 http://php.net/manual/zh/book.image.php
下面使用的各函数的参数,大家可以自己去官网查一查,一定会有所收获。
首先先把共同的需要实现好
header('Content-Type:image/png');
$image=imagecreatetruecolor(100,30);//新建一个真彩色图像,宽100,高30
$bgColor=imagecolorallocate($image,255,255,255) //为图像分配白色
imagefill($image,0,0,$bgColor); //从图像的左上角开始填充背景色
//生成干扰点元素
for($i=0;$i<200;$i++){ //生成200个干扰点
$pointColor=imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200));
//随机生成不同颜色的干扰点,注意干扰点的颜色要浅一点
imagesetpixel($image,rand(1,99),rand(1,29),$pointColor); //画一个单一像素
}
//生成干扰线
for($i=0;$i<3;$i++){ //生成3条干扰线
$lineColor=imagecolorallocate($image,rand(90,250),rand(90,250),rand(90,250),)//随机生成不同颜色的干扰线,注意干扰线的颜色要浅一点
imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$lineColor); //画一条线段
}
到此,公共的部分完成了,我们用imagepng($image);
看看效果.
下面就来讲讲实现纯数字验证码,数字字母混合验证码,中文验证码。
1.纯数字验证码
//生成四个0-9的随机数字
for($i=0;$i<4;$i++){
$fontSize=6; //数字的大小
$fontColor=imagecolorallocate($image,rand(0,50),rand(0,50),rand(0,50)); //数字的颜色,弄深一点
$fontContent=rand(0,9); //随机生成0-9的数字
$x=(($i*100)/4)+rand(5,10); //四个数字尽量随机均匀分布在水平方向
$y=rand(5,10); //竖直方向
imagestring($image,$fontSize,$x,$y,$fontContent,$fontColor);
//水平的画一行字符串
}
imagepng($image);
到此,纯数字验证码创建完成,我们看看效果
2.数字加字母验证码
实现思路基本相同,只是用了一个数组来存放数字和字母,然后通过substr()函数随机截取4个元素即可。
for($i=0;$i<4;$i++){
$fontSize=6;
$fontColor=imagecolorallocate($image,rand(0,50),rand(0,50),rand(0,50));
$data='abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNPRSTUVWXY3456789';
//这里我把l,1,0,o这些比较容易混的去掉了
$fontContent=substr($data,rand(0,strlen($data)-1),1);
//随机截取一个元素
$x=(($i*100)/4)+rand(5,10); //四个数字尽量随机均匀分布在水平方向
$y=rand(5,10); //竖直方向
imagestring($image,$fontSize,$x,$y,$fontContent,$fontColor);
//水平的画一行字符串
}
imagepng($image);
我们来看看效果
3.生成汉字验证码
$texts='主要产品是听见啦金玉良缘冰清玉洁继往开来锦绣山河冰雪聪明功成名就桃花潭水深千尺不及汪伦送我情先帝创业未半而中道今天下三分益州疲弊此诚危急存亡之秋也然侍卫之臣不懈于内忠志之士忘身于外者盖追先帝之殊遇欲报之于陛下也诚宜开张圣听'; //汉字库
$str=str_split($texts,3); //将每个汉字分开放入数组
$fontFace='fonts/msyhbd.ttf'; //TrueType 字体,注意要支持中文的字体
for($i=0;$i<4;$i++){
$fontColor=imagecolorallocate($image,rand(0,50),rand(0,50),rand(0,50));
$index=rand(0,count($str)-1);
$fontContent=$str[$index];
imagettftext($image,mt_rand(20,24),mt_rand(-60,60),(40*i+20),mt_rand(30,35),$fontColor,$fontFace,$fontContent);
}
imagepng($image);
看看效果
需要注意两个地方:
1.选择的fontFace需要是支持中文的,比如正楷。。
2.中文要转化为utf8编码。
4.结语
到这里,要说的就全部说完了,相信大家应该都有一个大致的了解了,可以自己动手去实践一下。
如有不足的地方,欢迎大家批评指正。