前言
使用 GD库
来完成验证码功能非常简单,库中大量函数 API 堆在一起就成了这个功能,下面代码注释中详细介绍了每段代码的功能,非常适合新手。
完整代码
我把验证码功能 封装成了一个函数,因此可以 自定义配置,下面给出了完整代码及配置介绍。
下面这段代码可以直接粘贴到浏览器打开预览,查看效果。
<?php
/*
* //TODO: 验证码参数配置(GD库解决方案)
* @width(数值型): 组件宽度(默认值100)
* @height(数值型): 组件高度(默认值50)
* @length(数值型): 验证码多少位(默认值5)
* @type(数值型): 验证码的类型,分为纯数字(默认1)/纯字母(2)/数字字母混合(3)
*/
function verifyCode($width = 100, $height = 50, $length = 5, $type = 1){
# 1. 创建验证码画布(确立组件宽高)
$board = imagecreatetruecolor($width, $height);//画布大小
# 2. 创建随机调色板(深颜色用于验证码字/浅颜色用于背景)
// 浅色(140-255)
$shallow = imagecolorallocate($board, mt_rand(140,255), mt_rand(140,255), mt_rand(140,255));
// 深色(0-120)
$deep = imagecolorallocate($board, mt_rand(0,120), mt_rand(0,120), mt_rand(0,120));
imagefilledrectangle($board, 0, 0, $width, $height, $shallow);//画布背景上色
# 3. 确立验证码类型及创建模板(type)
switch($type){
case 1 : $str = '0123456789';//数据模板([1]数字0-9)
$code = substr(str_shuffle($str), 0, $length);//打乱顺序后截取
break;
case 2 : $arr = range('a', 'z');//数据模板([2]字母a-z)
shuffle($arr);//打乱顺序
$tmp = array_splice($arr, 0, 5);//临时模板
$code = join('', $tmp);//把数组组合成字符串
break;
case 3 : $atr = '123456789abcdefghjkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ';
//[3]混合0-9,a-z,A-Z(去掉了0 l o 这种难以识别的字母数字)
$code = substr(str_shuffle($atr), 0, $length);
break;
}
# 4. 将随机验证码写入到画布(循环写入)
for($i = 0; $i < $length; $i++){
$x = floor($width / $length) * $i;//横轴偏移量
$y = mt_rand(10, $height - 20);//竖轴偏移量(随机偏移)
imagechar($board, 5, $x, $y, $code[$i], $deep);//写入画布
}
# 5. 画入圆弧干扰线(随机横纵坐标细线)
for($i = 0; $i < $length; $i++){
imagearc($board,//画板
mt_rand(10, $$width),//横轴位置
mt_rand(10, $height),//竖轴位置
mt_rand(10, $width),//圆弧宽度
mt_rand(10, $height),//圆弧高度
mt_rand(0, 10), mt_rand(0,270),$deep);//旋转角度及颜色
}
# 6. 画入干扰点(随机横纵坐标点状圆)
for($i = 0; $i < 50; $i++){
imagesetpixel($board, mt_rand(0, $width), mt_rand(0, $height), $deep);
}
# 7. 指定输出类型并返回完整的验证码组件
ob_clean();//擦除缓冲区
header('Content-type: image/png');//输出类型
imagepng($board);//输出验证码
imagedestroy($board);//销毁内存(结束)
# 8. return 出去
return $code;
}
# 测试使用
verifyCode(100, 50, 5, 3);//宽为100,高为50,长度为5个字符,类型为混合型(数字+字母)
?>
上述代码,可以看到我配置的验证码属性为:
- 验证码组件宽度:100px
- 验证码组件高度:50px
- 验证码字符长度:5位数
- 验证码类型:混合型(数字+字母)
当然,数字类型 / 字母类型也都是自由选择,只需要调用验证码函数时改变传参值即可。