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

我会带着你远行 2023-07-20 13:40 37阅读 0赞

前言

在这里插入图片描述
使用 GD库来完成验证码功能非常简单,库中大量函数 API 堆在一起就成了这个功能,下面代码注释中详细介绍了每段代码的功能,非常适合新手。

完整代码

我把验证码功能 封装成了一个函数,因此可以 自定义配置,下面给出了完整代码及配置介绍。

下面这段代码可以直接粘贴到浏览器打开预览,查看效果。

  1. <?php
  2. /* * //TODO: 验证码参数配置(GD库解决方案) * @width(数值型): 组件宽度(默认值100) * @height(数值型): 组件高度(默认值50) * @length(数值型): 验证码多少位(默认值5) * @type(数值型): 验证码的类型,分为纯数字(默认1)/纯字母(2)/数字字母混合(3) */
  3. function verifyCode($width = 100, $height = 50, $length = 5, $type = 1){
  4. # 1. 创建验证码画布(确立组件宽高)
  5. $board = imagecreatetruecolor($width, $height);//画布大小
  6. # 2. 创建随机调色板(深颜色用于验证码字/浅颜色用于背景)
  7. // 浅色(140-255)
  8. $shallow = imagecolorallocate($board, mt_rand(140,255), mt_rand(140,255), mt_rand(140,255));
  9. // 深色(0-120)
  10. $deep = imagecolorallocate($board, mt_rand(0,120), mt_rand(0,120), mt_rand(0,120));
  11. imagefilledrectangle($board, 0, 0, $width, $height, $shallow);//画布背景上色
  12. # 3. 确立验证码类型及创建模板(type)
  13. switch($type){
  14. case 1 : $str = '0123456789';//数据模板([1]数字0-9)
  15. $code = substr(str_shuffle($str), 0, $length);//打乱顺序后截取
  16. break;
  17. case 2 : $arr = range('a', 'z');//数据模板([2]字母a-z)
  18. shuffle($arr);//打乱顺序
  19. $tmp = array_splice($arr, 0, 5);//临时模板
  20. $code = join('', $tmp);//把数组组合成字符串
  21. break;
  22. case 3 : $atr = '123456789abcdefghjkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ';
  23. //[3]混合0-9,a-z,A-Z(去掉了0 l o 这种难以识别的字母数字)
  24. $code = substr(str_shuffle($atr), 0, $length);
  25. break;
  26. }
  27. # 4. 将随机验证码写入到画布(循环写入)
  28. for($i = 0; $i < $length; $i++){
  29. $x = floor($width / $length) * $i;//横轴偏移量
  30. $y = mt_rand(10, $height - 20);//竖轴偏移量(随机偏移)
  31. imagechar($board, 5, $x, $y, $code[$i], $deep);//写入画布
  32. }
  33. # 5. 画入圆弧干扰线(随机横纵坐标细线)
  34. for($i = 0; $i < $length; $i++){
  35. imagearc($board,//画板
  36. mt_rand(10, $$width),//横轴位置
  37. mt_rand(10, $height),//竖轴位置
  38. mt_rand(10, $width),//圆弧宽度
  39. mt_rand(10, $height),//圆弧高度
  40. mt_rand(0, 10), mt_rand(0,270),$deep);//旋转角度及颜色
  41. }
  42. # 6. 画入干扰点(随机横纵坐标点状圆)
  43. for($i = 0; $i < 50; $i++){
  44. imagesetpixel($board, mt_rand(0, $width), mt_rand(0, $height), $deep);
  45. }
  46. # 7. 指定输出类型并返回完整的验证码组件
  47. ob_clean();//擦除缓冲区
  48. header('Content-type: image/png');//输出类型
  49. imagepng($board);//输出验证码
  50. imagedestroy($board);//销毁内存(结束)
  51. # 8. return 出去
  52. return $code;
  53. }
  54. # 测试使用
  55. verifyCode(100, 50, 5, 3);//宽为100,高为50,长度为5个字符,类型为混合型(数字+字母)
  56. ?>

上述代码,可以看到我配置的验证码属性为:

  • 验证码组件宽度:100px
  • 验证码组件高度:50px
  • 验证码字符长度:5位数
  • 验证码类型:混合型(数字+字母)

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

发表评论

表情:
评论列表 (有 0 条评论,37人围观)

还没有评论,来说两句吧...

相关阅读

    相关 js实现验证功能

    \前面是拆解着讲的,不想看可以直接跳过,带注释的完整版代码和效果在后面 首先在页面中准备一个输入框,一个显示验证码的盒子和一个提交按钮 <body>

    相关 javaweb实现验证功能

    在javaweb的用户注册与登陆功能时,有时为了防止漏洞或者大量注册,可以使用验证码功能,下面是验证码的一个简单实现 验证码类 public class V

    相关 邮箱验证功能实现

    在进行实际项目的开发过程中,我们可能会遇到需要需要对用户账号密码进行找回,这时就需要我们通过邮件进行验证,从而对用户信息进行修改,下面我就将自己开发过程中的邮件发送功能简单描述