php封装的验证码类分享


Posted in PHP onFebruary 26, 2017

验证码是我们开发的时候经常用到的功能,所以在此本人包装了一个验证码类,应该可以作为php的类插件用,在此分享给各位读友。

实现的原理也是很简单,就是利用画布的几个函数,再加上一些字符串的获取,东凑西凑就构成了,呵呵。

这里大概写一下思路吧,其实这个类已经注释的非常清楚了,不过,个人还是在行文前??乱幌隆?/p>

首先是关于一些函数的解释,这里的解释纯属个人体会,有什么错误的地方,还请读者指正。

1、创建画布函数:imagecreatetruecolor(w,h);

说明:用于创建一个画布。

w 画布的宽

h 画布的高

此函数的返回值资源类(gd)

2、为画布创建一种颜色:imagecolorallocate(img,red,green,blue)

说明:

img画布资源

red,green,blue

是0~255的范围

3、为画布添加背景色

imagefill(img,x,y,color);

说明:

在 image 图像的坐标 x,y(图像左上角为 0, 0)

4、画边框

imagerectangle($img,x1,y1,x2,y2,color);

说明:

其左上角坐标为 x1, y1,右下角坐标为 x2, y2。图像的左上角坐标为 0, 0。

3、绘制内容(字符)

imagestring(img ,size,x,y,string,color);

说明:

img画布

size是字大小 1至5

x,y是起始点

string是所要画的内容

color是颜色

4、告诉浏览器图片格式

header("Content-type:image/png");可为image/gif等等

5、输出(或保存),也可以使用第2个参数实现保存

imagepng(img【,filename】)

imagejpeg(img【,filename】)

imagegif(img【,filename】)

6、添加干扰线,本质就是直线

imageline(img,x1,y1,x2,y2,color);

说明:

img 画布

x1,y1 起点

x2,y2 终点

color 颜色

7、imagettftext ( img,size, angle, x, y, color, fontfile,text )

说明:

img 画布

size 字体大小,缺省单位像素

angle 角度

x,y 坐标点

color 颜色

fontfile 字体文件,必须是中文字体

text 内容

特别说明:这里的color参数都是imagecolorallocate()函数创建的颜色

下面是思路:

这里最先生成画布,之后就是为画布添加字符串,直线,噪点,边框,来生成验证码的,最后类返回的两个公用接口是:可供外面调用的生成验证码的画布和验证码的字符串构成,为的是给外界输出验证码画布,以及存储字符串,作为验证用

下面是代码:

<?php
namespace captcha;
/*
*验证码类
*verify方法生成验证码字符串
*entry方法生成验证码
*特别提醒:这里要先用entry生成验证码,再用verify生成验证码的字符串,也就是必须先调用entry,然后才能够调用verify生成验证码的字符串,原因代码已经说明问题了,因为验证码的字符串是在entry方法调用captchaImage生成的,所以必须先调用它才行
*有的地方对中文的字体要求比较高,所以,有的地方不支持中文验证码
*/
class Captcha{
  //配置参数
  private $config = array();
  //验证码
  private $verifyCode = '';
  //获取配置文件的配置信息,给类传参数就行,例如new Captcha($config);$config是你的配置文件信息
  public function __construct($config=array('width'=>100,'height'=>40,'length'=>4,'size'=>7,'lines'=>0,'dots'=>0,'font'=>'simfang.ttf','rectangle'=>array(255,55,122),'charset'=>true,'chinese'=>'来到新机场主航站楼建设在婚姻关系存续期间所负债务她在收到要求她偿还前夫在婚姻关系存续期间所欠债务的法院传票后要精益求精善始善终')){
    $this->config = $config;
  }
  //创建验证码
  private function captchaImage(){
    //画布
    $img = imagecreatetruecolor($this->config['width'],$this->config['height']);
    //填充画布颜色
    imagefill($img,0,0,imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
    //需要边框则画边框
    if($this->config['rectangle'] && is_array($this->config['rectangle']) && count($this->config['rectangle']) == 3){
      $this->tangle($img);
    }
    $this->verifyCode = $this->code($img,$this->config['charset'],$this->config['chinese']);
    //存在则添加干扰线
    if($this->config['lines']){
      $this->codeLines($img);
    }
    //存在则添加干扰点
    if($this->config['dots']){
      $this->codeDots($img);
    }
    return $img;
  }
  private function codeLines($img){
    //绘制干扰线
    for($i=0;$i<$this->config['lines'];$i++){
      imageline($img,mt_rand(0,$this->config['width'] / 10),mt_rand(0,$this->config['height']),mt_rand($this->config['width'] * 7/ 10,$this->config['width'] * 9/ 10),mt_rand(0,$this->config['height']),imagecolorallocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)));
    }
  }
  private function codeDots($img){
    //添加噪点
    for($i=0;$i<$this->config['dots'];$i++){
      //噪点颜色
      $color = imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180));
      imagestring($img,mt_rand(1,3),mt_rand(0,170),mt_rand(0,30),'*',$color);
    
    }
  }
  /*画布边框*/
  private function tangle($img){
    imagerectangle($img,0,0,$this->config['width']-1,$this->config['height']-1,imagecolorallocate($img,$this->config['rectangle'][0],$this->config['rectangle'][1],$this->config['rectangle'][2]));
  }
  /*生成验证码,默认英文,$ch为true则为中文*/
  private function code($img,$ch=false,$set=''){
    $str = "";
    //计算间隔
    $span = ceil($this->config['width']/($this->config['length']+1));
    if($ch && !empty($set)){
      //随机产生字符
      $set = $this->config['chinese'];
      for($i=0;$i<$this->config['length'];$i++){
        $end = strlen($set)/3;
        $pos = mt_rand(0,$end-1);
        $str .= substr($set,$pos*3,3);
      }
      //每次绘制一个字符
      for($i=1;$i<=$this->config['length'];$i++){
        imagettftext($img,16,mt_rand(-30,60),$i*$span,$this->config['height']*3/5,imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)),$this->config['font'],substr($str,($i-1)*3,3));
      }
    }else{
      //随机生成字母或者数字
      for($i=0;$i<$this->config['length'];$i++){
        switch(mt_rand(0,2)){
          case 0:
          $str .= chr(mt_rand(65,90));
          break;
        case 1:
          $str .= chr(mt_rand(97,122));
          break;
        case 2:
          $str .= chr(mt_rand(48,57));
        }
      }
      //每次绘制一个字符
      for($i=1;$i<=$this->config['length'];$i++){
        imagestring($img,$this->config['size'],$i*$span,0,$str[$i-1],imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)));
      }
    }
    return $str;
  }
  //获取验证码
  public function verify(){
    return $this->verifyCode;
  }
  //生成验证码
  public function entry(){
    header("content-type:image/png");
    imagepng($this->captchaImage());
  }
}
$ob = new Captcha;
$ob->entry();

最后,为了不误人子弟,还是再强调一遍:
这里必须先用entry生成验证码,再用verify生成验证码的字符串,也就是必须先调用entry,然后才能够调用verify生成验证码的字符串,原因代码已经说明问题了,因为验证码的字符串是在entry方法的方法captchaImage中生成的,所以必须先调用它才行 有的地方对中文的字体要求比较高,所以,有的地方不支持中文验证码

PHP 相关文章推荐
PHP 七大优势分析
Jun 23 PHP
生成ubuntu自动切换壁纸xml文件的php代码
Jul 17 PHP
PHP基础知识回顾
Aug 16 PHP
php读取excel文件示例分享(更新修改excel)
Feb 27 PHP
PHP读取文件内容后清空文件示例代码
Mar 18 PHP
JavaScript创建命名空间的5种写法
Jun 24 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
PHP使用PDO连接ACCESS数据库
Mar 05 PHP
详解yii2实现分库分表的方案与思路
Feb 03 PHP
PHP静态成员变量
Feb 14 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
PHP7 list() 函数修改
Mar 09 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
Feb 25 #PHP
简单谈谈PHP中的trait
Feb 25 #PHP
laravel中命名路由的使用方法
Feb 24 #PHP
cakephp常见知识点汇总
Feb 24 #PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
Feb 24 #PHP
PHP函数rtrim()使用中的怪异现象分析
Feb 24 #PHP
CakePHP框架Session设置方法分析
Feb 23 #PHP
You might like
用在PHP里的JS打印函数
2006/10/09 PHP
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
经验几则 推荐
2006/09/05 Javascript
JavaScript 对象、函数和继承
2009/07/07 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
javascript中的五种基本数据类型
2015/08/26 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
python实现二叉树的遍历
2017/12/11 Python
Python解析Excle文件中的数据方法
2018/10/23 Python
Python内置类型性能分析过程实例
2020/01/29 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
银行出纳岗位职责
2013/11/25 职场文书
高中数学教学反思
2014/01/30 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
人力资源主管职责范本
2014/03/05 职场文书
保密承诺书范文
2014/03/27 职场文书
校外活动方案
2014/08/28 职场文书
党委书记群众路线对照检查材料思想汇报
2014/10/04 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
学历证明范文
2015/06/16 职场文书
仓库管理制度范本
2015/08/04 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
Redis过期数据是否会被立马删除
2022/07/23 Redis