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 相关文章推荐
关于PHP5 Session生命周期介绍
Mar 02 PHP
str_replace只替换一次字符串的方法
Apr 09 PHP
php的sprintf函数的用法 控制浮点数格式
Feb 14 PHP
thinkPHP中验证码的简单实现方法
Dec 05 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
May 05 PHP
PHP PDO操作MySQL基础教程
Jun 05 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
PHP获取ttf格式文件字体名的方法示例
Mar 06 PHP
PHP模版引擎原理、定义与用法实例
Mar 29 PHP
laravel框架创建授权策略实例分析
Nov 22 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
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
执行iframe中的javascript方法
2008/10/07 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
ReactNative列表ListView的用法
2017/08/02 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
利用python实现AR教程
2019/11/20 Python
Python socket聊天脚本代码实例
2020/01/02 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
解决pip install psycopg2出错问题
2020/07/09 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
好的演讲稿开场白
2013/12/30 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
法人代表任命书范本
2014/06/05 职场文书
员工升职自荐信
2015/03/27 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
800字作文之大雪
2019/12/04 职场文书
编写python程序的90条建议
2021/04/14 Python