PHP是怎么实现自动生成验证码的呢?
导读:这篇文章主要为大家详细介绍了PHP是怎么实现自动生成验证码的呢?的内容,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望对大家学习或工作能有帮助,接下来就跟随小编一起来学习吧。 现在验证码在表单中的应用越来越多了...
这篇文章主要为大家详细介绍了PHP是怎么实现自动生成验证码的呢?的内容,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望对大家学习或工作能有帮助,接下来就跟随小编一起来学习吧。现在验证码在表单中的应用越来越多了,但是如果用js来实现总觉得不太方便,因此使用php来实现下,在此记录下。
当然,我们也可以封装成一个函数,以后使用的时候也是很方便的,这里并未封装,感兴趣的小伙伴可以自己封装下。
具体实现代码:
新建一个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;
$i4;
$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;
$i300;
$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;
$i4;
$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 = new idCode(5,60,30);
$iC->
createPNG();
class idCode{
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;
//构造函数
public function __construct($count,$width,$height){
$this->
count = $count;
$this->
getFonts();
$this->
height = $height;
$this->
width = $width;
}
private function getFonts(){
$dir = dir($this->
path);
while(false !== ($file = $dir->
read())){
if($file != '.' &
&
$file != '..'){
$this->
fonts[count($this->
fonts)] = basename($file);
}
}
$dir->
close();
}
private function createKeys(){
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)];
}
}
public function createPNG(){
$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];
//x 0 2 4 6,y1 3 5 7;
左下,右下,右上,左上
$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);
}
public function checkKeys($input){
if(count($input)!=$this->
count){
return 'ERROR:长度不正确.';
}
else{
for($i=0;
$i $this->
count;
$i++){
//0 o O I l 1 校准,根据所选择的字体确定是否需要手动校准
if($input[$i] != $this->
keys[$i]['char']){
return 'SUCCESS.';
}
else{
return 'ERROR:请输入正确验证码.';
}
}
}
}
}
?>
关于“PHP是怎么实现自动生成验证码的呢?”的内容就介绍到这,感谢各位的阅读,相信大家对PHP是怎么实现自动生成验证码的呢?已经有了进一步的了解。大家如果还想学习更多知识,欢迎关注网络,小编将为大家输出更多高质量的实用文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: PHP是怎么实现自动生成验证码的呢?
本文地址: https://pptw.com/jishu/652662.html
