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编程网上资源导航
Oct 09 PHP
Ha0k 0.3 PHP 网页木马修改版
Oct 11 PHP
PHP 日,周,月点击排行统计
Jan 11 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
php for 循环使用的简单实例
Jun 02 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
laravel 事件/监听器实例代码
Apr 12 PHP
PHP创建对象的六种方式实例总结
Jun 27 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
PHP获取文件行数的方法
2015/06/10 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
神奇的代码 通杀各种网站-可随意修改复制页面内容
2008/07/17 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
2015/06/08 Javascript
Textarea输入字数限制实例(兼容iOS&amp;安卓)
2017/07/06 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
Python中AND、OR的一个使用小技巧
2015/02/18 Python
Python编程实现控制cmd命令行显示颜色的方法示例
2017/08/14 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
学年自我鉴定范文
2013/10/01 职场文书
给面试官的感谢信
2014/02/01 职场文书
丑小鸭教学反思
2014/02/03 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
推销搭讪开场白
2015/05/28 职场文书
Redis 常见使用场景
2021/08/30 Redis
MySQL创建管理KEY分区
2022/04/13 MySQL