用PHP写的验证码

先谈谈代码的顺序

1.准备画布
2.分配颜色
3.使用相关函数进行绘画
4.告诉别人你画的是什么
5.输出或者保存图像
6.释放资源

先写一个简单的

<?php
    //1.准备画布
    $img = imagecreatetruecolor(500,500);
    //2.分配颜色
    $back = imagecolorallocate($img,255,0,0);
    $fontcolor = imagecolorallocate($img,0,0,255);
    $color = imagecolorallocate($img,0,0,0);
    //echo $name;
    //3.绘画
        //为背景填充颜色
        imagefill($img,0,0,$back);
        //写字
        imagechar($img,10,10,10,'H',$fontcolor);
        //画点
        for($i=0;$i<10000;$i++){
            imagesetpixel($img,mt_rand(1,499),mt_rand(1,499),$color);
        }
        //画线
        for($i=0;$i<20;$i++){
            //随机颜色
            $linecolor = imagecolorallocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
            imageline($img,mt_rand(1,499),mt_rand(1,499),mt_rand(1,499),mt_rand(1,499),$linecolor);
        }
        //写字
        $color = imagecolorallocate($img,255,255,0);
        imagettftext($img,mt_rand(10,20),0,70,70,$color,'./msyh.ttf','哈哈哈,随便写点');
    //4.告诉浏览器你画的是什么
    header('Content-type:image/jpeg');
    //5.输出到浏览器  对应图片的格式输出
    imagejpeg($img);
    //6.释放资源
    imagedestroy($img);

那我们写一个类,来方便我们使用

<?php
    //写一个验证码类

    class Vcode{
        //成员属性
        //画布宽
        private $width;
        //画布高
        private $height;
        //画布资源
        private $img;
        //写字的数量
        private $codeNum;
        //字体文件
        private $fontFile;


        //成员方法
        //初始化画布的宽 高
        function __construct($fontfile = '',$width = 100,$height = 40,$codeNum = 4){
            $this->width = $width;
            $this->height = $height;
            $this->codeNum = $codeNum;
            $this->fontFile = $fontfile;
        }
        //定义一个输出的方法
        public function show(){
            //调用点
            //创建画布
            $this->createImage();
            //设置干扰点
            $this->setpixel();
            //设置干扰先
            $this->imgLine();
            //设置验证码字体
            $this->createFont();
            //显示验证码图片
            $this->showImage();
        }
        //定义一个魔术方法__tostring()
        function __toString(){
            $this->show();
            return '';
        }
        //准备创建画布的方法
        private function createImage(){
            //创建真彩色画布
            $this->img = imagecreatetruecolor($this->width,$this->height);
            //为画布分配背景颜色
            $back = imagecolorallocate($this->img,mt_rand(220,255),mt_rand(220,255),mt_rand(200,255));
            //填充背景颜色
            imagefill($this->img,0,0,$back);
            //给背景设置边框
            //分配边框颜色
            $borderColor = imagecolorallocate($this->img,255,0,0);
            //画一个矩形
            imagerectangle($this->img,0,0,$this->width-1,$this->height-1,$borderColor);
        }
        //准备显示图像的方法
        private function showImage(){
            header("Content-type:image/jpeg");
            imagejpeg($this->img);
        }
        //准备画干扰线的方法
        private function imgLine(){
            //循环10条线
            for($i=0;$i<10;$i++){
                //为线分配随机颜色
                $lineColor = imagecolorallocate($this->img,mt_rand(150,180),mt_rand(150,180),mt_rand(150,180));
                imageline($this->img,mt_rand(2,$this->width-2),mt_rand(2,$this->height-2),mt_rand(2,$this->width-2),mt_rand(2,$this->height-2),$lineColor);
            }
        }
        //准备画干扰点的方法
        private function setpixel(){
            //循环画干扰点
            for($i=0;$i<300;$i++){
                //为干扰点随机分配颜色
                $pixelColor = imagecolorallocate($this->img,mt_rand(120,150),mt_rand(120,150),mt_rand(120,150));
                //画点
                imagesetpixel($this->img,mt_rand(2,$this->width-2),mt_rand(2,$this->height-2),$pixelColor);
            }
        }
        //获取字符方法
        private function getFont(){

            $ascii = '';
            $str = '345678ABCDEFGHJKLMNPQRSTUVWXYabcdefhijkmnpqrstuvwxy';
            //随机四个数
            for($i=0;$i<$this->codeNum;$i++){
                //每次循环都随机打乱一次字符串
                $str = str_shuffle($str);
                //获取四个字
                $char = $str{mt_rand(0,strlen($str)-1)};
                //str_shuffle();//随机打乱字符
                $ascii .= $char;
            }
            //存验证码中的数字
            $_SESSION['code'] = $ascii;
            //返回拼接好后的四个字符
            return $ascii;
        }
        //写字的方法
        private function createFont(){
            //获取要写入的字符
            $ascii = $this->getFont();
            //判断是否传入 字体文件 如果传入 则使用字体文件的字体来书写验证码
            if($this->fontFile != ''){
                //传入了字体库文件  使用freetype字体写入
                for($i=0;$i<$this->codeNum;$i++){
                    //随机分配字体颜色
                    $fontColor = imagecolorallocate($this->img,mt_rand(10,90),mt_rand(10,90),mt_rand(10,90));
                    //获取x 的位置
                    $x = $i*($this->width/$this->codeNum)+mt_rand(5,8);
                    //获取Y的位置
                    $y = mt_rand($this->height/2,$this->height-3);
                    //使用freetype字体写入文件
                    imagettftext($this->img,mt_rand(15,20),mt_rand(0,40),$x,$y,$fontColor,$this->fontFile,$ascii{$i});
                }
            }else{
                //没有传入字体文件
                for($i=0;$i<$this->codeNum;$i++){
                    //随机分配字体颜色
                    $fontColor = imagecolorallocate($this->img,mt_rand(10,90),mt_rand(10,90),mt_rand(10,90));
                    $x = $i*($this->width/$this->codeNum)+mt_rand(3,8);
                    $y = mt_rand(10,20);
                    imagechar($this->img,mt_rand(3,5),$x,$y,$ascii{$i},$fontColor);
                }
            }
        }
        //析构方法  销毁资源
        function __destruct(){
            //销毁图像资源
            imagedestroy($this->img);
        }
    }
    // $c = new Vcode('./msyh.ttf');
    // //$c->show();
    // echo $c;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值