PHP

画一个验证码 - PHP GD2库

这篇文章带大家从零开始用PHP做一个验证码(底部有附件)

什么是GD2

GD2是PHP的图像处理扩展,帮我们处理生成图片,常常用来做验证码,缩略图

打开GD2

如果你在用phpstudy的话,这一步就很简单啦,在其他选项菜单的扩展设置里勾选上即可
也可以找到你的php.ini文件,搜索GD2的dll,去掉前面的分号重启服务器就可以了

GD库画图流程

这里给大家打个预防针,GD2的函数很丧心病狂,函数最高可达11个参数,所以,学GD2库时,千万不要死记硬背它的参数.要着重理解它的流程,知道流程,参数看手册就好了

使用Windows画图板画图时,我们的步骤一般是这样的

  1. 新建空白画布
  2. 创建颜料
  3. 画图形或写字
  4. 输出/保存图形
  5. 销毁画布(关闭画板)

GD2也是如此

<?php
//创建画布 imagecreatetruecolor(宽,高);
$im = imagecreatetruecolor(300,200);
//创建颜料 imagecolorallocate(画布,红,绿,蓝)
$red = imagecolorallocate($im , 255 , 0 ,0);
//画椭圆 imageellipse(画布 , 圆心x坐标 , 圆心y坐标 , 宽 , 高 , 边框颜色)
imageellipse($im,150,100,300,200,$red);
//输出imagepng(画布[,保存位置])或者imagejpeg(),imagegif()
imagepng($im , './test1.png');
//销毁画面 imagedestroy(画布)
imagedestroy($im);

色彩填充

先看一段代码

//1 创建画布
$img = imagecreatetruecolor(400, 400);
//2 创建颜色
$red = imagecolorallocate($img, 255, 0, 0);
$blue = imagecolorallocate($img, 0, 0, 255);
//3 先填充颜色 改变x,y轴参数观察特
imagefill($img, 200, 200, $red);
//4 再画椭圆
imageellipse($img, 200, 200, 300, 400, $blue);
//5 保存图片
imagepng($img,'./img.png');
// 6 销毁画布
imagedestroy($img);

运行文件,会在目录下生成一个img.png
img.png
如果我们把3、4步调换一下位置会发现什么呢?
img.png
我们发现,先填充颜色,后画图形,是填充背景
而先画图形,后填充颜色,是填充椭圆
其实这和画图板的油漆桶一个道理,大家可以试一下先画一个不封闭的图形会发现什么

这个时候大家可能要犯迷糊了:“你写的都是什么啊,这么多函数我一个都看不懂”
正如开头所说,大家重点是熟悉流程,建议大家可以边看手册看阅读文章,效果会好一些(我才不会说是因为函数太多不想写呢)

验证码

熟悉了基本的操作,我们来开始验证码吧!
(旁白:Σ(っ °Д °;)っ啥?这就开始了?刚刚讲啥了?)

这个没关系,文章最后我会把验证码代码+详细注释发给大家,慢慢对应手册看就能看懂了

先来分析一下验证码需要什么,如图
QQ截图20190606225156.png
可以看到,我们需要

  1. 随机的字母和数字
  2. 背景
  3. 干扰线
  4. 干扰点

一步一步来,首先是随机字母和数字,这个用PHP 截取字符串函数即可实现

 //验证码词条
function randStr($length = 4)
{
    $str = str_shuffle('abcdefghjkmnpqrstuvwxyABCDEFGHJKMNPQRSTUVWXY3456789'); //随机打乱
    $str = substr($str, 0, $length); //截取字符串
    return $str; //返回结果
}

想要几个就执行几次函数即可,
接着封装验证码函数

function makeCode($num)
{

}

参数num表示验证码的位数,剩下的代码都在这个函数中写

1.创建画布、颜色、以及填充背景

    $image = imagecreatetruecolor(120, 70);//创建画布
    $gray = imagecolorallocate($image, 200, 200, 200);//创建颜色
    imagefill($image, 0, 0, $gray);//填充背景

2.写入文字(验证码)
这一步我用的是imagettftext,还有另一种方法imagestring,有兴趣可以看一下

    $ttf_route = "D:/phplian/SophomoreProject/php-gd2/task/STSONG.TTF";//字体路径(绝对)
    $word = randStr(4);//需要几个
    //for循环写入文字
    for ($i = 0; $i < $num; $i++) {
        $fontX = (100 / $num) * $i + 20; //调整字体间距 每次循环进来 x+20
        imagettftext($image, 20, mt_rand(-35, 35), $fontX, 42, mt_rand(0, 80000), $ttf_route, $word[$i]);
    }

3.干扰线
循环画线

    for ($i = 0; $i < 2; $i++) {
        imageline($image, 0, mt_rand(10, 60), 120, mt_rand(10, 60), mt_rand(0, 80000));
    }

4.干扰点
循环画点

    for ($i = 0; $i < 70; $i++) {
        imagesetpixel($image, mt_rand(0, 120), mt_rand(0, 70), mt_rand(0, 80000));
    }

5.输出并销毁画布

    //输出背景
    header('Content-Type:image/png'); //header标注头
    imagepng($image);
    //关闭(摧毁)画布
    imagedestroy($image);

这样就封装好一个验证码函数了,调用一下,就可以输出了
附件奉上,大家下载后记得改一下文件的绝对路径
附件:验证码
中文验证码

微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

支付宝扫一扫,向我赞赏

回复

This is just a placeholder img.