验证码是我们开发的时候经常用到的功能,所以在此本人包装了一个验证码类,应该可以作为PHP的类插件用,在此分享给各位读友。
实现的原理也是很简单,就是利用画布的几个函数,再加上一些字符串的获取,东凑西凑就构成了,呵呵。
这里大概写一下思路吧,其实这个类已经注释的非常清楚了,不过,个人还是在行文前啰嗦一下。
首先是关于一些函数的解释,这里的解释纯属个人体会,有什么错误的地方,还请读者指正。
1、创建画布函数:imagecreatetruecolor(w,h);
说明:用于创建一个画布。
w 画布的宽
h 画布的高
此函数的返回值资源类(gd)
2、为画布创建一种颜色:imagecolorallocate(img,red,green,blue)
说明:
img画布资源
red,green,blue 是0~255的范围
3、为画布添加背景色
imagefill(img,x,y,color);
说明:
在 image 图像的坐标 x,y(图像左上角为 0,0)
4、画边框
imagerectangle($img,x1,y1,x2,y2,color);
说明:
其左上角坐标为 x1,y1,右下角坐标为 x2,y2。图像的左上角坐标为 0,0。
3、绘制内容(字符)
imagestring(img,size,string,color);
说明:
img画布
size是字大小 1至5
x,y是起始点
string是所要画的内容
color是颜色
4、告诉浏览器图片格式
header("Content-type:image/png");可为image/gif等等
5、输出(或保存),也可以使用第2个参数实现保存
imagepng(img【,filename】)
imagejpeg(img【,filename】)
imagegif(img【,filename】)
6、添加干扰线,本质就是直线
imageline(img,color);
说明:
img 画布
x1,y1 起点
x2,y2 终点
color 颜色
7、imagettftext ( img,angle,color,fontfile,text )
说明:
img 画布
size 字体大小,缺省单位像素
angle 角度
x,y 坐标点
color 颜色
text 内容
特别说明:这里的color参数都是imagecolorallocate()函数创建的颜色
下面是思路:
这里最先生成画布,之后就是为画布添加字符串,直线,噪点,边框,来生成验证码的,最后类返回的两个公用接口是:可供外面调用的生成验证码的画布和验证码的字符串构成,为的是给外界输出验证码画布,以及存储字符串,作为验证用
下面是代码:
}
}
/画布边框/
private function tangle($img){
imagerectangle($img,$this->config['width']-1,$this->config['height']-1,$this->config['rectangle'][0],$this->config['rectangle'][1],$this->config['rectangle'][2]));
}
/生成验证码,默认英文,$ch为true则为中文/
private function code($img,$ch=false,$set=''){
$str = "";
//计算间隔
$span = ceil($this->config['width']/($this->config['length']+1));
if($ch && !empty($set)){
//随机产生字符
$set = $this->config['chinese'];
for($i=0;$i<$this->config['length'];$i++){
$end = strlen($set)/3;
$pos = mt_rand(0,$end-1);
$str .= substr($set,$pos3,3);
}
//每次绘制一个字符
for($i=1;$i<=$this->config['length'];$i++){
imagettftext($img,16,mt_rand(-30,60),$i$span,$this->config['height']3/5,180)),$this->config['font'],substr($str,($i-1)3,3));
}
}else{
//随机生成字母或者数字
for($i=0;$i<$this->config['length'];$i++){
switch(mt_rand(0,2)){
case 0:
$str .= chr(mt_rand(65,90));
break;
case 1:
$str .= chr(mt_rand(97,122));
break;
case 2:
$str .= chr(mt_rand(48,57));
}
}
//每次绘制一个字符
for($i=1;$i<=$this->config['length'];$i++){
imagestring($img,$this->config['size'],$str[$i-1],180)));
}
}
return $str;
}
//获取验证码
public function verify(){
return $this->verifyCode;
}
//生成验证码
public function entry(){
header("content-type:image/png");
imagepng($this->captchaImage());
}
}
$ob = new Captcha;
$ob->entry();
最后,为了不误人子弟,还是再强调一遍: 这里必须先用entry生成验证码,再用verify生成验证码的字符串,也就是必须先调用entry,然后才能够调用verify生成验证码的字符串,原因代码已经说明问题了,因为验证码的字符串是在entry方法的方法captchaImage中生成的,所以必须先调用它才行 有的地方对中文的字体要求比较高,所以,有的地方不支持中文验证码