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 相关文章推荐
做个自己站内搜索引擎
Oct 09 PHP
php 移除数组重复元素的一点说明
Nov 27 PHP
php 图片加水印与上传图片加水印php类
May 12 PHP
ThinkPHP采用模块和操作分析
Apr 18 PHP
PHP Undefined index报错的修复方法
Jul 17 PHP
PHP读取txt文件的内容并赋值给数组的代码
Nov 03 PHP
使用PHP强制下载PDF文件示例
Jan 17 PHP
PHP 搜索查询功能实现
Nov 29 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
Jun 20 PHP
php+redis消息队列实现抢购功能
Feb 08 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
浅谈Laravel中使用Slack进行异常通知
May 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
深入理解PHP之require/include顺序 推荐
2011/01/02 PHP
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
2012/07/16 PHP
PHP array_multisort() 函数的深入解析
2013/06/20 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
js获取url参数的使用扩展实例
2007/12/29 Javascript
Firefox div高度自适应
2009/04/28 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
详解js类型判断
2018/05/22 Javascript
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
sublime text 3配置使用python操作方法
2017/06/11 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
通过Python实现一个简单的html页面
2020/05/16 Python
基于python图书馆管理系统设计实例详解
2020/08/05 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
语文教育专业推荐信范文
2013/11/25 职场文书
小组合作学习反思
2014/02/18 职场文书
项目经理聘任书
2014/03/29 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
信仰纪录片观后感
2015/06/08 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis