• php生成验证码


    <?php
    namespace service;
    class VerifyCode {
        /**
         * 存放图片,字体的根目录
         * @var string
         */
        private $resourceRoot = __DIR__;
        /**
         * 验证码的背景图
         * @var string
         */
        private $jamImg = "/jam_1.png";
        /**
         * 生成验证码所用的字体
         * @var string
         */
        private $font = '/LTYPEB.TTF';
        /**
         * 验证码图片宽
         * @var int
         */
        private $sizeWidth = 96;
        /**
         * 验证码图片高
         * @var type
         */
        private $sizeHeight = 30;
        /**
         * 验证码长度
         * @var int
         */
        private $codeLength = 4;
        /**
         * 验证码所包含的字符类型
         * @var int
         */
        private $chrType = 1;//1 数字,2 大写字母, 4 小写字母, 8 中文 混合类型为对应类型之和
        /**
         * 本次验证码内容
         * @var string
         */
        private $code = array();
        /**
         * 保存生成验证码将要用到的字符
         * @var array
         */
        private $chrs;
        /**
         * 生成的图片
         * @var resource
         */
        private $img;
        /**
         * 构造函数
         */
        public function __construct($chrType = null, $codeLength = null) {
            if($chrType){
                $this->setChrType($chrType);
            }
            if($codeLength){
                $this->setCodeLength($codeLength);
            }
            $this->jamImg = $this->resourceRoot.$this->jamImg;
            $this->font = $this->resourceRoot.$this->font;
        }
        /**
         * 设置生成验证码要用的字符类型
         * @param int $chrType 1 数字,2 大写字母, 4 小写字母, 8 中文 混合类型为对应类型之和
         */
        public function setChrType($chrType){
            $this->chrType = $chrType;
        }
        /**
         * 设置验证码的长度
         * @param int $codeLength 验证码长度
         */
        public function setCodeLength($codeLength){
            $this->codeLength = $codeLength;
        }
        /**
         * 初始化生成验证码将要用到的字符集
         */
        private function initChrs(){
            $this->chrs = array(
                'length' => 0,
                'code' => array()
            );
            if($this->chrType & 1){//数字
                $this->addAscii(48, 10);
            }
            if($this->chrType & 2){//大写字母
                $this->addAscii(65, 26);
            }
            if($this->chrType & 4){//小写字母
                $this->addAscii(97, 26);
            }
            if($this->chrType & 8){//一级中文字
                $this->addAscii(0, 3755);
            }
        }
        /**
         * 添加生成验证码要用到的字符集
         * @param int $start 字符集起始Ascii码
         * @param int $length 字符集长度
         */
        private function addAscii($start, $length){
            $this->chrs['code'][] = array($start, $length);
            $this->chrs['length'] += $length;
        }
        /**
         * 找出数值对应的中文字符
         * @param int $code 数值
         */
        private function codeToUTF8($code){
            $y = $code % 94;
            $x = ($code - $y) / 94;
            $gb2312 = dechex(176 + $x).dechex(160 + $y + 1);
            return iconv('gb2312', 'utf-8', pack('H*', $gb2312));
        }
        /**
         * 将随机生成的数值转换成对应的字符
         * @param int $code 随机数
         * @return string
         */
        private function transferCode($code){
            foreach($this->chrs['code'] as $item){
                if($code < $item[1]){
                    $code += $item[0];
                    break;
                }else{
                    $code -= $item[1];
                }
            }
            if($item[0]){
                return chr($code);
            }else{
                return $this->codeToUTF8($code);
            }
        }
        /**
         * 生成验证码
         */
        public function generateCode(){
            $this->initChrs();
            for($i = 0; $i < $this->codeLength; $i++){
                $this->code[] = $this->transferCode(mt_rand(0, $this->chrs['length'] - 1));
            }
            return $this->getCode();
        }
        /**
         * 给制验证码
         */
        protected function createImage(){
            $jamImg = imagecreatefrompng($this->jamImg);
            $imageInfo = getimagesize($this->jamImg);
            $this->img = imagecreatetruecolor($this->sizeWidth ,$this->sizeHeight);
            imagefill($this->img, 0, 0, imagecolorallocate($this->img, 255, 255, 255));
            foreach($this->code as $i => $chr){
                $color = imagecolorallocate($this->img, rand(0,100), rand(0,100), rand(0,100));
                imagettftext($this->img, rand(20, 25), rand(350, 370), $i*18+rand(0,5) + 10, 24+rand(0,5), $color, $this->font, $chr);
            }
            imagecopy($this->img, $jamImg, 0, 0, rand(0,$imageInfo[0]-$this->sizeWidth), rand(0,$imageInfo[1]-$this->sizeHeight), $this->sizeWidth ,$this->sizeHeight);
        }
        /**
         * 输出验证码
         */
        protected function printImage(){
            header("Content-type: image/jpeg");
            imagejpeg($this->img, null, 80);
            imagedestroy($this->img);
        }
        /**
         * 生成验证码
         */
        public function draw(){
            $this->createImage();
            $this->printImage();
        }
        /**
         * 获取本次验证码内容
         * @return string
         */
        public function getCode(){
            return implode('', $this->code);
        }
    }
    ?>
     public function picVerifyCode()
        {
            Session::start(true);
            $verifyCode = new VerifyCode(1,4);
            $_SESSION['verifyCode'] = $verifyCode->generateCode();
            $verifyCode->draw();
        }
  • 相关阅读:
    百度富文本编辑器的上传图片的路径问题
    laravel初次学习总结及一些细节
    macOS apache配置及开启虚拟服务器的开启,apache开启重写模式
    类似于qq空间类型的评论和回复
    向php提交数据及json
    mac 初次配置apache,及mac下安装mysql
    C#连接mysql数据库插入数据后获取自增长主键ID值
    PHP 真正多线程的使用
    C# 连接mysql数据库
    MySql状态查看方法 MySql如何查看连接数和状态?
  • 原文地址:https://www.cnblogs.com/huangguojin/p/6656731.html
Copyright © 2020-2023  润新知