php 利用GD库实现一个验证码功能(封装成了函数可自定义配置验证码外观及功能)

前言

在这里插入图片描述
使用 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位数
  • 验证码类型:混合型(数字+字母)

当然,数字类型 / 字母类型也都是自由选择,只需要调用验证码函数时改变传参值即可。

发布了287 篇原创文章 · 获赞 464 · 访问量 92万+

猜你喜欢

转载自blog.csdn.net/weixin_44198965/article/details/105258796
今日推荐