平时我们在登录或注册一些网站的时候都会输入一些验证码,验证码上也会有一些点或者线作为干扰项,当你看不见的时候可以选择换一张或者看不清来切换验证码。这个方法是比较常见且常用的,前几天自己也写了一个,拿出来跟大家分享分享,希望对大家有所帮助。
首先你得创建一个PHP文件,创建好PHP文件之后就来看功能的实现方法吧。
// 设置session,必须处于脚本的最顶端
session_start();
// 新建一个真色彩图像 imagecreatetruecolor(int $width, int $height)返回一个图像表示,
// 代表一个x_size 和 y_size 的黑色图像
$image = imagecreatetruecolor(100,30);
// imagecolorallocate 一幅图像分配颜色
// 本函数用来匹配图形的颜色,供其它绘图函数使用。
// 参数 image 表示图形的 handle。参数 red、green、blue 是色彩三原色,其值从0至255。
// imagecolorallocate($image,255,255,255);表示白色
$color = imagecolorallocate($image,255,255,255);
//区域填充 imagefill($image,0,0,$color);中的 0,0表示X、Y轴的起始坐标
imagefill($image,0,0,$color);
$string = '';
//随机生成数字
for ($i=0; $i < 4 ; $i++) {
// 设置字体的大小
$fontsize = 20;
// 设置字体颜色,随机颜色
$fontcolor = imagecolorallocate($image,rand(0,50),rand(0,50),rand(0,50));
// 设置数字
// $fontcontent = rand(0,9);
// 设置数字加字母
$data = 'abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ123456789';
// substr函数返回字符串中的一部分
// strlen函数返回字符串的长度
// rand生成随机数 rand(0,max)生成 0~max之间的随机整数
$fontcontent = substr($data, rand(0,strlen($data) - 1),1);
// $fontcontent = substr($data, rand(0,strlen($data)),1);
$string .= $fontcontent;
// 设置坐标
$x = ($i*100/4)+ rand(5,10);
$y = rand(5,10);
// imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor)
// imagestring() 用fontcolor颜色将字符串fontcontent画到image所代表的图像的x,y坐标处
//(这是字符串左上角坐标,整幅图像的左上角为 0,0)如果 font 是 1,2,3,4 或 5,
// 则使用内置字体。
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
// 存到session
$_SESSION['authcode'] = $string;
// 增加干扰元素,设置雪花点
for ($i=0; $i < 200 ; $i++) {
// 设置点的颜色,50-200颜色比数字浅不干扰阅读
$pointcolor = imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200));
// imagesetpixel 画一个单一像素
// imagesetpixel(图片资源,X轴坐标范围,Y轴坐标范围,颜色标识符);
imagesetpixel($image,rand(1,99),rand(1,29),$pointcolor);
}
// 增加干扰元素,设置横线
for ($i=0; $i < 4; $i++) {
// 设置线的颜色
$linecolor = imagecolorallocate($image,rand(80,220),rand(80,220),rand(80,220));
// 设置线,两点一线
// imageline($image ,$x1 ,$y1 ,$x2 ,$y2 ,$color )
// imageline() 用 color 颜色在图像 image 中从坐标
// x1,y1 到 x2,y2(图像左上角为 0, 0)画一条线段。
imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
}
// 设置头部,image/png
header('Content-Type:image/png');
//imagepng 建立png图形函数
imagepng($image);
// imagedestroy 结束图形函数 销毁$image
imagedestroy($image);
运行的截图如下: