新建一个cap_sz.php文件:
<?php
session_start();//设置session,一定要在顶部
$width=150;//设置图片宽为300像素
$height=40;//设置图片高为40像素
$image=imagecreatetruecolor($width,$height);//设置验证码大小的函数
$bgcolor=imagecolorallocate($image,255,255,255);//验证码颜色RGB为(255,255,255)#ffffff
imagefill($image,0,0,$bgcolor);//区域填充
$cap_code="";
for($i=0;$i<4;$i++){
$fontsize=7;//设置字体大小
$fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
//数字越大,颜色越浅,这里是深颜色0-120
$fontcontent=rand(0,9);
$cap_code.=$fontcontent;//.=连续定义变量
$x=($i*150/4)+rand(5,10);
$y=rand(5,10);
//设置坐标
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
$_SESSION['code']=$cap_code;//存到session
//设置干扰元素,设置雪花点
for($i=0;$i<300;$i++){
$inputcolor=imagecolorallocate($image,rand(50,200),rand(20,200),rand(50,200));
//设置颜色,20-200颜色比数字浅,不干扰阅读
imagesetpixel($image,rand(1,149),rand(1,39),$inputcolor);
//画一个单一像素的元素
}
//增加干扰元素,设置横线(先设置线的颜色,在设置横线)
for($i=0;$i<4;$i++){
$linecolor=imagecolorallocate($image,rand(20,220),rand(20,220),rand(20,220));
//设置线的颜色
imageline($image,rand(1,149),rand(1,39),rand(1,299),rand(1,149),$linecolor);
}
//因为有些浏览器,访问的content-type会是文本型(乱码),所以我们需要设置成图片的格式类型
header('Content-Type:image/png');
imagepng($image);//建立png函数
imagedestroy($image);//结束图形函数,消除$image
实例扩展:
<?php
$iC=newidCode(5,60,30);
$iC->createPNG();
classidCode{
private$words=array('a','b',
'c','d','e','f','g','h','i','j','k','l',
'm','n','o','p','q','r','s','t','u','v',
'w','x','y','z','A','B','C','D','E','F',
'G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z',
'0','1','2','3','4','5','6','7','8','9');
private$fonts;
private$count;//验证码字符数
private$height;
private$width;
private$path='..\myfolder\fonts';
private$keys;
//构造函数
publicfunction__construct($count,$width,$height){
$this->count=$count;
$this->getFonts();
$this->height=$height;
$this->width=$width;
}
privatefunctiongetFonts(){
$dir=dir($this->path);
while(false!==($file=$dir->read())){
if($file!='.'&&$file!='..'){
$this->fonts[count($this->fonts)]=basename($file);
}
}
$dir->close();
}
privatefunctioncreateKeys(){
for($i=0;$i<$this->count;$i++){
$this->keys[$i]['char']=$this->words[rand(0,count($this->words)-1)];
//使用字体路径标识
$this->keys[$i]['filename']=$this->path.'\\'.$this->fonts[rand(0,count($this->fonts)-1)];
}
}
publicfunctioncreatePNG(){
$this->createKeys();
//创建画布以及颜色块儿
$bg=imagecreatetruecolor($this->width+10*2,$this->height+3*2);//两边留10px空白,上下3px
$grey=imagecolorallocate($bg,155,155,155);
$blue=imagecolorallocate($bg,0x00,0x00,0xff);
//填充背景
imagefill($bg,0,0,$grey);
//添加字符
$pwidth=$this->width/$this->count;
$x;$y;
for($i=0;$i<$this->count;$i++){
$rotation=rand(-40,40);//偏转角度±40°
$fontsize=33;
$width_txt;
$height_txt;
do{
$fontsize--;
$bbox=imagettfbbox($fontsize,$rotation,$this->keys[$i]['filename'],$this->keys[$i]['char']);
$width_txt=$bbox[2]-$bbox[0];//x0246,y1357;左下,右下,右上,左上
$height_txt=$bbox[7]-$bbox[1];
}while($fontsize>8&&($height_txt>$this->height||$width_txt>$pwidth));
$fontcolor=imagecolorallocate($bg,rand(0,255),rand(0,255),rand(0,255));
$x=8+$pwidth*$i+$pwidth/2-$width_txt/2;//x坐标基本位置
$y=$this->height/2-$height_txt/2;
imagettftext($bg,$fontsize,$rotation,$x,$y,$fontcolor,$this->keys[$i]['filename'],$this->keys[$i]['char']);
}
//绘制干扰线
//根据字体酌情增加干扰线
imageline($bg,0,15,40,10,$blue);
//图像输出头文件
header('Content-type:image/png');
//输出png图像
imagepng($bg);
//清除缓存资源
imagedestroy($bg);
}
publicfunctioncheckKeys($input){
if(count($input)!=$this->count){
return'ERROR:长度不正确.';
}else{
for($i=0;$i<$this->count;$i++){
//0oOIl1校准,根据所选择的字体确定是否需要手动校准
if($input[$i]!=$this->keys[$i]['char']){
return'SUCCESS.';
}else{
return'ERROR:请输入正确验证码.';
}
}
}
}
}
?>
|