php实现自动生成验证码的实例讲解


Posted in PHP onNovember 17, 2021

现在验证码在表单中的应用越来越多了,但是如果用js来实现总觉得不太方便,因此使用php来实现下,在此记录下。

当然,我们也可以封装成一个函数,以后使用的时候也是很方便的,这里并未封装,感兴趣的小伙伴可以自己封装下。

具体实现代码:

新建一个cap_sz.php文件:

<?php
session_start(); //设置session,一定要在顶部
$width = 150; //设置图片宽为300像素
$height = 40; //设置图片高为40像素
$image = imagecreatetruecolor($width, $height); //设置验证码大小的函数
$bgcolor = imagecolorallocate($image, 255, 255, 255); //验证码颜色RGB为(255,255,255)#ffffff
imagefill($image, 0, 0, $bgcolor); //区域填充
$cap_code = "";
for($i=0;$i<4;$i++){
    $fontsize = 7; //设置字体大小
    $fontcolor = imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120));
    //数字越大,颜色越浅,这里是深颜色0-120
    $fontcontent = rand(0,9);
    $cap_code.=$fontcontent; //.=连续定义变量
    $x = ($i*150/4)+rand(5,10);
    $y = rand(5,10);
    //设置坐标
    imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);
}
$_SESSION['code'] = $cap_code; //存到session
//设置干扰元素,设置雪花点
for($i=0;$i<300;$i++){
    $inputcolor = imagecolorallocate($image, rand(50,200), rand(20,200), rand(50,200));
    //设置颜色,20-200颜色比数字浅,不干扰阅读
    imagesetpixel($image, rand(1,149), rand(1,39), $inputcolor);
    //画一个单一像素的元素
}
//增加干扰元素,设置横线(先设置线的颜色,在设置横线)
for ($i=0;$i<4;$i++) {
    $linecolor = imagecolorallocate($image, rand(20,220), rand(20,220),rand(20,220));
    //设置线的颜色
    imageline($image, rand(1,149), rand(1,39), rand(1,299), rand(1,149), $linecolor);
 
}
 
//因为有些浏览器,访问的content-type会是文本型(乱码),所以我们需要设置成图片的格式类型
header('Content-Type:image/png');
imagepng($image); //建立png函数
imagedestroy($image); //结束图形函数,消除$image

实例扩展:

<?php
$iC = new idCode(5,60,30);
$iC->createPNG();

class idCode{
  private $words = array('a','b',
  'c','d','e','f','g','h','i','j','k','l',
  'm','n','o','p','q','r','s','t','u','v',
  'w','x','y','z','A','B','C','D','E','F',
  'G','H','I','J','K','L','M','N','O','P',
  'Q','R','S','T','U','V','W','X','Y','Z',
  '0','1','2','3','4','5','6','7','8','9');
  private $fonts;
  private $count;//验证码字符数
  private $height;
  private $width;
  private $path = '..\myfolder\fonts';
  private $keys;

  //构造函数
  public function __construct($count,$width,$height){
    $this->count = $count;
    $this->getFonts();
    $this->height = $height;
    $this->width = $width;
  }

  private function getFonts(){
    $dir = dir($this->path);

    while(false !== ($file = $dir->read())){
        if($file != '.' && $file != '..'){
          $this->fonts[count($this->fonts)] = basename($file);
        }
    }
    $dir->close();
  }

  private function createKeys(){
    for($i = 0;$i < $this->count;$i++){
      $this->keys[$i]['char'] = $this->words[rand(0,count($this->words)-1)];
      //使用字体路径标识
      $this->keys[$i]['filename'] = $this->path.'\\'.$this->fonts[rand(0,count($this->fonts)-1)];
    }
  }

  public function createPNG(){
    $this->createKeys();

    //创建画布以及颜色块儿
    $bg = imagecreatetruecolor($this->width + 10*2,$this->height + 3*2);//两边留10px空白,上下3px
    $grey = imagecolorallocate($bg,155,155,155);
    $blue = imagecolorallocate($bg,0x00,0x00,0xff);
    //填充背景
    imagefill($bg,0,0,$grey);
    //添加字符
    $pwidth = $this->width/$this->count;
    $x;$y;
    for($i = 0;$i < $this->count;$i++){
      $rotation = rand(-40,40);//偏转角度±40°
      $fontsize = 33;
      $width_txt;
      $height_txt;

      do{
        $fontsize--;
        $bbox = imagettfbbox($fontsize,$rotation,$this->keys[$i]['filename'],$this->keys[$i]['char']);
        $width_txt = $bbox[2] - $bbox[0];//x 0 2 4 6,y1 3 5 7;左下,右下,右上,左上
        $height_txt = $bbox[7] - $bbox[1];
      }while($fontsize > 8 && ($height_txt > $this->height || $width_txt > $pwidth));

      $fontcolor = imagecolorallocate($bg,rand(0,255),rand(0,255),rand(0,255));
      $x = 8 + $pwidth*$i + $pwidth/2 - $width_txt/2;//x坐标基本位置
      $y = $this->height/2 - $height_txt/2;

      imagettftext($bg,$fontsize,$rotation,$x,$y,$fontcolor,$this->keys[$i]['filename'],$this->keys[$i]['char']);
    }
    //绘制干扰线
    //根据字体酌情增加干扰线
    imageline($bg,0,15,40,10,$blue);
    //图像输出头文件
    header('Content-type:image/png');
    //输出png图像
    imagepng($bg);
    //清除缓存资源
    imagedestroy($bg);
  }

  public function checkKeys($input){
    if(count($input)!=$this->count){
      return 'ERROR:长度不正确.';
    }else{
      for($i=0;$i < $this->count;$i++){
        //0 o O I l 1 校准,根据所选择的字体确定是否需要手动校准
        if($input[$i] != $this->keys[$i]['char']){
          return 'SUCCESS.';
        }else{
          return 'ERROR:请输入正确验证码.';
        }
      }
    }
  }
}
?>

到此这篇关于php实现自动生成验证码的实例讲解的文章就介绍到这了,更多相关php实现自动生成验证码的方法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHP获取MAC地址的函数代码
Sep 11 PHP
php.ini修改php上传文件大小限制的方法详解
Jun 17 PHP
php中fsockopen用法实例
Jan 05 PHP
php使用数组填充下拉列表框的方法
Mar 31 PHP
PHP可变变量学习小结
Nov 29 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
Dec 21 PHP
PHP MVC框架skymvc支持多文件上传
May 26 PHP
学习PHP Cookie处理函数
Aug 09 PHP
Yii2创建多界面主题(Theme)的方法
Oct 08 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
Jun 28 PHP
php通过header发送自定义数据方法
Jan 18 PHP
php支付宝APP支付功能
Jul 29 PHP
php将xml转化对象的实例详解
Nov 17 #PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 #PHP
php png失真的原因及解决办法
Oct 24 #PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 #PHP
PHP中多字节字符串操作实例详解
Aug 23 #PHP
PHP使用QR Code生成二维码实例
Jul 07 #PHP
PHP设计模式(观察者模式)
Jul 07 #PHP
You might like
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
laravel 5 实现模板主题功能(续)
2015/03/02 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
PHP读取文件或采集时解决中文乱码
2021/03/09 PHP
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
2014/06/05 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python+POP3实现批量下载邮件附件
2018/06/19 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
2020/06/04 HTML / CSS
采购文员岗位职责
2013/11/20 职场文书
烹调加工管理制度
2014/02/04 职场文书
银行优秀员工事迹
2014/02/06 职场文书
抄作业检讨书
2014/02/17 职场文书
应届生面试求职信
2014/07/02 职场文书
采购员岗位职责
2015/02/03 职场文书
新闻通讯稿模板
2015/07/22 职场文书
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技