php imagepng quality 0 文件变大_PHP产生验证码

利用php中的GD库可以完成验证码类的开发。后盾人教程

PHP创建图像步骤

发送HTTP头信息,声明内容为图像
header('Content-type:image/gif');
header('Content-type:image/jpeg');
header('Content-type:image/png');

通过设置头信息让浏览器渲染出图像,而不是HTML等其他类型

创建画布
imageCreateTrueColor(width,height);

width & height 画布宽高,即为输出图片的尺寸,返回为source 类型,后续操作都是针对这个资源展开。

创建绘图所需要的颜色
imageColorAllocate(img_resource,R,G,B);

颜色从属于创建画布产生的图像资源而存在,后面三个值分别为红绿蓝三个通道的值,为int类型,在0—255之间。

绘图(填充画布、画圆、画方块、画线条、画布上写字)

? 填充画布(画布背景)

imageFill(img_resource,x,y,color);

? 画圆

//绘制空心圆形
imageEllipse(img_res,x,y,w,h,color);
//绘制填充好的实心圆
imageFilledEllipse(img_res,x,y,w,h,color);

绘制 圆心(x,y) 宽 x,高 h,的圆

? 画方

//空心矩形
imageRectangle(img_res,x1,y1,x2,y2,color);
//实心矩形
imageFilledRectangle (img_res,x1,y1,x2,y2,color);

(x1,y1)为左上角坐标, (x2,y2)为右下角坐标

eeacd1995d970aa086d417f8c2ebc617.gif
绘制矩形图示

?画线条

imageLine(img_res,x1,y1,x2,y2,color)

(x1,y1)与(x2,y2)两点确定的直线。

? 绘制像素(点)

imagesetpixel ( img_res , x , y , color )

? 输入文本

imagettftext (img_res , size , angle , x , y , color , fontfile ,text )

图像资源,字体尺寸,角度,第一个字符的基本点(大概是字符的左下角),Y 坐标(字体基线的位置),颜色 ,字体文件绝对路径(realpath($path)获取),文本字符串(UTF-8 编码)

✨文本盒子?

imagettfbbox ( size , angle , fontfile , text );

返回一个含有 8 个单元的数组表示了文本外框的四个角,得到文本范围的盒子大小,可以方便控制文本输出位置:

变量位置
0左下角 X 位置
1左下角 Y 位置
2右下角 X 位置
3右下角 Y 位置
4右上角 X 位置
5右上角 Y 位置
6左上角 X 位置
7左上角 Y 位置
输出图像
imagegif(img_resource[,filename]);
imagejpeg(img_resource[,filename]);
imagepng(img_resource[,filename]);
imagebmp(img_resource[,filename]);

当设置第二个参数时表示储存文件,如果存在同名文件会覆盖

释放画布资源
imageDestroy(img_resource);

图像输出完毕及时释放资源,把内存空间留给更需要的程序。

验证码类

Verificationcode类

绘制画布,设置背景色,先写入随机文本,然后绘制随机干扰线,干扰点就可

<?php class Verificationcode{protected $width;protected $height;protected $len;public $imgsource;protected $size;protected $fontfile;protected $rescode;public function __construct($w = 200, $h = 50, $len = 4, $size = null){$this->width = $w;$this->height = $h;$this->len = $len;$this->size = is_null($size) ? $h * 0.4 : $size;$this->fontfile = realpath("source.ttf");
    }public function render(){$this->bg();$this->line();//文字下$this->text();$this->line();//文字上$this->pix();$this->show();return $this->rescode;
    }//绘制画布private function bg(){
        $img = imageCreateTrueColor($this->width, $this->height);$this->imgsource = $img;
        imagefill(
            $img,0,0,
            imageColorAllocate($img, 120, 120, 120)
        );
    }//绘制随机线条private function line(){for ($i = 0; $i 3; $i++) {
            imagesetthickness($this->imgsource, mt_rand(1, 3));
            imageLine(
                $this->imgsource,
                mt_rand(0, $this->width),
                mt_rand(0, $this->height),
                mt_rand(0, $this->width),
                mt_rand(0, $this->height),
                $this->ran_color()
            );
        }
    }

    //绘制干扰点
    private function pix(){
        for ($i = 0; $i 800; $i++) {
            imagesetpixel(
                $this->imgsource,
                mt_rand(0, $this->width),
                mt_rand(0, $this->height),
                $this->ran_color()
            );
        }
    }

    //随机文本
    private function text(){
        $range = "abcdefghijklmnopqrstuvwxyz0123456789";
        $code = '';
        for ($i = 0; $i $this->len; $i++) {
            $text = $range[mt_rand(0, strlen($range) - 1)];
            $box = imagettfbbox($this->size, 0, $this->fontfile, $range[$i]);
            imagettftext(
                $this->imgsource,
                $this->size,
                mt_rand(-30, 30),
                ($this->width / $this->len) * $i + 10,
                $this->height / 2 + ($box[0] - $box[7]) / 2,
                $this->ran_text_color(),
                $this->fontfile,
                strtoupper($text)
            );
            $code .= strtoupper($text);
        }
        $this->rescode = $code;
    }

    //设置头信息并且输出png
    private function show(){
        header('Content-type:image/png');
        imagepng($this->imgsource);
    }

    private function ran_color(){
        return imageColorAllocate(
            $this->imgsource,
            mt_rand(0, 255),
            mt_rand(0, 255),
            mt_rand(0, 255),
        );
    }

    private function ran_text_color(){
        return imageColorAllocate(
            $this->imgsource,
            mt_rand(0, 80),
            mt_rand(0, 80),
            mt_rand(0, 80),
        );
    }

}

说明:

  • 如果不设置参数,默认图片尺寸为200×50,验证码长度为4,字体为 (0.4*图片高度)
  • 通过计算使得文本始终处在垂直居中,水平分散对齐的状态
后端使用

server.php

<?php //引入渲染验证码图片,并将这次返回的验证码存到session中include "Verificationcode.php";
session_start();//session开始之前不能有输出
$code = new Verificationcode();
$res = $code->render();
$_SESSION["captcha"]=$res;
imageDestroy($code->imgsource);

说明:

  • 调用render()函数,即可绘制出验证码图片,并返回这次的验证码字符串。
  • 通过将返回的验证码字符串存入session中,可以进行后续验证操作
前端使用
<img src="server.php" alt="" onclick="this.src='server.php?'+Math.random()">

✨ 可以将整个form表单提交至php后端,然后通过session中存储的验证码字符串进行验证,例如

<form action="check.php" method="post" enctype="multipart/form-data">
    <table>
        <tr>
            <td><input type="text" placeholder="请输入验证码" name="captcha">
            <td><img src="server.php" alt="" onclick="this.src='server.php?'+Math.random()">
            td>
        tr>
    table>
    <button>确定button>
form>

check.php

<?php 
session_start();include "main.html";if (@strtoupper($_POST["captcha"])==@$_SESSION["captcha"]){echo "

验证通过

";
}else{echo "

验证失败!

";
}

???

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值