验证码功能(个人理解):
- 减轻服务器的压力(如12306的验证码功能);
- 防止暴力注册
个人思路:在a-z,a-z,1-9生成n位随机的数来构成新的验证码。
关于生成验证码的几个小函数
range() //指定范围输出一个数组
a) 如: range(1,9)
array_merge()//合并数组
a) array_merge(数组1,数组2….)
array_rand(数组,数量)
a) 随机从数组中取出几个下标返回一个数组
- shuffle(数组)//将再一次打乱数组中元素
- mt_rand(指定一个范围) //生成一个更好的随机数
- 如: mt_rand(1,5) //生成一个在1-5之间的任意数
生成验证码代码
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php
$arr1 =range( 'a' , 'z' ); //指定范围输出一个数组
$arr2 =range( 'a' , 'z' );
$arr3 =range(1,9);
$arr = array_merge ( $arr1 , $arr2 , $arr3 ); //合并数组
$index = array_rand ( $arr ,5); //在$arr中随机取5个数,返回值是$arr的下标
shuffle( $index );
$code = '' ; //定义一个空的字符串来存储生成的验证码用'点'来进行拼接
foreach ( $index as $key => $value ) { //遍历数组
$code .= $arr [ $value ]; //根据下标取数组中的值
}
var_dump( $code );
?>
|
运行结果截图
完善:要把验证码添加到图像中这样的验证码才逼真
在完善之前先介绍有关图像创建的大致步骤
创建图像
方法一: 创建一个真彩色图像 (空画布)
imagecreatetruecolor(width, height) //创建一个真彩色图像
说明:
- width : 画布的宽度(像素)
- height: 画布的高度(像素)
- 返回值为图像资源
注意:
为真彩色图像: 填充颜色
imagefill(image, x, y, color) //为图像资源填充颜色
说明:
- image //图像资源
- x,y,填充的坐标点(注意:填充的与此点最接近的颜色)
- color; //用什么颜色来填充
为真彩色图像: 分配颜色
imagecolorallocate(image, red, green, blue)
说明:
- image //图像资源
- red: //红颜色(0-255) 或 0x(00-ff) //即十六进制来表示 (0xff就是255)
- green//绿颜色(0-255)
- blue //蓝颜色(0-255)
imagefill和imagecolorallocate的代码演示
在没有给画布填充颜色时的效果
给画布填充颜色时的效果和代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php
//创建图像资源(空白画布)默认显示为黑色
$image = imagecreatetruecolor(300, 400);
//1.image //图像资源
//2.red: //红颜色(0-255) 或 0x(00-ff) //即十六进制来表示 (0xff就是255)
//3.green//绿颜色(0-255)
//4.blue //蓝颜色(0-255)
$color = imagecolorallocate( $image , 255, 0, 0);
//1.image //图像资源
//2.x,y,填充的坐标点(注意:填充的与此点最接近的颜色)
//3.color; //用什么颜色来填充
imagefill( $image , 0, 0, $color );
//输出图像
header( 'content-type:image/jpeg' );
imagejpeg( $image );
//销毁图像资源
imagedestroy( $image );
?>
|
结果截图;
输出图像(以jpeg为例)
输出图像到浏览器
a) header('content-type:image/jpeg'); //设置将图像通过浏览来查看
b) imagejpeg(图像资源)
按文件进行输出图像
a) imagejpeg(图像资源,'图像路径',图像的质量) //质量取值0-100
b) 注意:
注意:只能jpeg格式才有质量这个参数.
销毁图像
imagedestroy($image); //销毁图像,释放内存资源.
注意: 当前生成几个图像资源,就销毁几个.
验证码的整个代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<?php
//实例:让文本居于图像的正中
//创建图像资源(空白的画布)
$image = imagecreatetruecolor(100, 50);
$color = imagecolorallocate( $image , mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));
//为图像资源填充颜色
imagefill( $image , 0, 0, $color );
//绘制图像
$font = 5;
//验证码的开始
$arr1 = range( 'a' , 'z' );
$arr3 = range( 'a' , 'z' );
$arr2 = range(1,9);
//array_merge — 合并一个或多个数组
$arr = array_merge ( $arr1 , $arr2 , $arr3 );
$index = array_rand ( $arr ,5); //随机从原数组中找出5个下标
$string = '' ;
foreach ( $index as $value ) { //$value 两个功能,即是$index中的值,又是$arr中的下标
$string .= $arr [ $value ]; //将得到字符进行连接
}
//验证码的结束
//mt_rand — 生成更好的随机数
//echo mt_rand(1,5);die;
//加入点干扰
$pointcolor = imagecolorallocate( $image , mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));
//循环创建1000个干扰点
for ( $i =0; $i <1000 ; $i ++) {
imagesetpixel( $image , mt_rand(0,imagesx( $image )), mt_rand(0,imagesy( $image )), $pointcolor );
}
//加入线的干扰
$lintecolor = imagecolorallocate( $image , mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));
// 循环创建50个线干扰
for ( $i =0; $i <50 ; $i ++) {
imageline( $image , mt_rand(0,imagesx( $image )), mt_rand(0,imagesy( $image )), mt_rand(0,imagesx( $image )), mt_rand(0,imagesy( $image )) , $lintecolor );
}
//一个字符的宽度 imagefontwidth($font)
//字符串的个数: strlen(字符串)
//一个字符的宽度*字符串的个数
//所有字符串宽度和= 一个字符的宽度*字符串的个数
//$x = (画布的宽度-所有字符串宽度和)/2
$x = (imagesx( $image )-imagefontwidth( $font )* strlen ( $string ))/2;
//$y = (画布的高度-字符的高度)/2;
//字符的高度: imagefontheight($font)
$y = (imagesy( $image )-imagefontheight( $font ))/2;
$stringcolor = imagecolorallocate( $image , mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));
imagestring( $image , $font , $x , $y , $string , $stringcolor );
//输出图像
header( 'content-type:image/jpeg' ); //设置将图像通过浏览来查看
imagejpeg( $image , '' ,100); //将图像资源输出
//销毁图像资源
imagedestroy( $image ); //销毁图像
|
理解代码中的一些函数
加入干扰的点
imagesetpixel(image, x, y, color)
说明:x,y 一个点的坐标
加入干扰的线
imageline(image, x1, y1, x2, y2, color)
说明: x1,y1是线的一个端点坐标; x2,y2是线的另一个端口的坐标; 由两点画一条线
让验证码居于图像的正中
1
2
3
4
5
|
imagefontheight(font)获取字体的高度:
imagefontwidth(font)获取字体的宽度:
strlen (字符串) //获取字符串的长度
imagesx(image) //获取画布的宽度
imagesy(image) //获取画布的高度
|
最后运行结果
再次完善(和html代码结合起来)
html代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<!doctype html>
<html lang= "en" >
<head>
<meta charset= "utf-8" >
<title>document</title>
</head>
<body>
<form name= 'frm' method= 'post' action= '' >
<table width= "30%" border= "2" align= "center" rules= "all" cellpadding= "10" >
<tr>
<th colspan= "2" >请输入信息</th>
</tr>
<tr>
<th>姓名:</th>
<th><input type= "text" name= "username" ></input></th>
</tr>
<tr>
<th>密码:</th>
<th><input type= "password" name= "userpwd" ></input></th>
</tr>
<tr> 555556
<th>验证码</th>
<th><input type = 'text' name = 'checkcode' ></input><img src= "21.php" style= "cursor:pointer" onclick= "this.src='21.php'?+math.random()" ></th>
</tr>
<tr>
<th colspan= "2" ><input type= "submit" name= "submit" value= "提交" ></input></th>
</tr>
</table>
</form>
</body>
</html>
|
理解;
最后结果截图
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持服务器之家!