本文讲解一个PHP实现的验证码类
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
config(
'宽度'
,
'高度'
,
'字符个数'
,
'验证码session索引'
);
*
$image
->create();
//这样就会向浏览器输出一张图片
*
//所有参数都可以省略,
* 默认是:宽80 高20 字符数4 验证码session索引captcha_code
* 第四个参数即把验证码存到
$_SESSION
[
'captcha_code'
]
* 最简单使用示例:
*
$image
=
new
Captcha();
*
$image
->create();
//这样就会向浏览器输出一张图片
*/
class
Captcha
{
private
$width
=80,
$height
=20,
$codenum
=4;
public
$checkcode
;
//产生的验证码
private
$checkimage
;
//验证码图片
private
$disturbColor
=
''
;
//干扰像素
private
$session_flag
=
'captcha_code'
;
//存到session中的索引
//尝试开始session
function
__construct(){
@session_start();
}
/*
* 参数:(宽度,高度,字符个数)
*/
function
config(
$width
=
'80'
,
$height
=
'20'
,
$codenum
=
'4'
,
$session_flag
=
'captcha_code'
)
{
$this
->width=
$width
;
$this
->height=
$height
;
$this
->codenum=
$codenum
;
$this
->session_flag=
$session_flag
;
}
function
create()
{
//输出头
$this
->outFileHeader();
//产生验证码
$this
->createCode();
//产生图片
$this
->createImage();
//设置干扰像素
$this
->setDisturbColor();
//往图片上写验证码
$this
->writeCheckCodeToImage();
imagepng(
$this
->checkimage);
imagedestroy(
$this
->checkimage);
$_SESSION
[
$this
->session_flag]=
$this
->checkcode;
}
/*
* @brief 输出头
*/
private
function
outFileHeader()
{
header (
"Content-type: image/png"
);
}
/**
* 产生验证码
*/
private
function
createCode()
{
$this
->checkcode =
strtoupper
(
substr
(md5(rand()),0,
$this
->codenum));
}
/**
* 产生验证码图片
*/
private
function
createImage()
{
$this
->checkimage = @imagecreate(
$this
->width,
$this
->height);
$back
= imagecolorallocate(
$this
->checkimage,255,255,255);
$border
= imagecolorallocate(
$this
->checkimage,0,0,0);
imagefilledrectangle(
$this
->checkimage,0,0,
$this
->width - 1,
$this
->height - 1,
$back
);
// 白色底
imagerectangle(
$this
->checkimage,0,0,
$this
->width - 1,
$this
->height - 1,
$border
);
// 黑色边框
}
/**
* 设置图片的干扰像素
*/
private
function
setDisturbColor()
{
for
(
$i
=0;
$idisturbColor
= imagecolorallocate(
$this
->checkimage, rand(0,255), rand(0,255), rand(0,255));
imagesetpixel(
$this
->checkimage,rand(2,128),rand(2,38),
$this
->disturbColor);
}
}
/**
*
* 在验证码图片上逐个画上验证码
*
*/
private
function
writeCheckCodeToImage()
{
for
(
$i
=0;
$icodenum
;
$i
++)
{
$bg_color
= imagecolorallocate (
$this
->checkimage, rand(0,255), rand(0,128), rand(0,255));
$x
=
floor
(
$this
->width/
$this
->codenum)*
$i
;
$y
= rand(0,
$this
->height-15);
imagechar (
$this
->checkimage, rand(5,8),
$x
+5,
$y
,
$this
->checkcode[
$i
],
$bg_color
);
}
}
function
__destruct()
{
unset(
$this
->width,
$this
->height,
$this
->codenum,
$this
->session_flag);
}
}
?>
|