『PHP学习笔记』系列十:PHP制作验证码

引入: 

定义:验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写 ,是一种区分用户是计算机还是人的公共全自动程序。验证码由最初的简单字符串到现在各式各样复杂的图片、计算、问题等,只是因为计算机识别的功能已经越来越强大。

PHP:PHP作为一款强大的后台处理语言,操作图片是必不可少的,PHP本身不操作图片,但是可以借助强大的扩展库实现图片的操作。PHP主要使用GD库实现图片操作。

开启GD库:

1,GD库作为一种扩展项,需要事先加载才能使用,加载的方式就是在php.ini中开启GD扩展。

开启后可在PHP中进行验证:

<?php
echo "<pre>";
//查看当前安装的GD库的信息
var_dump(gd_info());
echo "</pre>";

 2,GD库加载后,内置了很多函数供开发人员操作,可以通过操作手册索引中输入image来检索。

3,常用的GD函数列表

  • imagecreatetruecolor:创建一张真彩画布

  • imagecolorallocate:给画布分配颜色

  • imagefill:填充颜色

  • imagestring:水平写字符串(ASCII码)

  • imagettftext:文本写入

  • imageline:制作线段

  • imagecreatefromjpeg:打开一张jpeg图片

  • imagecreatefrompng:打开一张png图片

  • imagecopymerge:拷贝图像合并到另外一张图片资源

  • imagecopyresampled:不失真拷贝图片到另外一张图片资源

  • imagepng:保存或者输出图片,保存格式为png

  • imagejpeg:保存或者输出图片,保存格式为jpeg

  • imagedestroy:销毁资源

  • getimagesize:取得图片信息

制作验证码:

验证码制作流程

  • 制作画布:imagecreatetruecolor

  • 填充背景色:imagecolorallocate分配颜色,imagefill填充颜色

  • 写入内容:imagestring写简单内容,imagettftext写入字体文字

  • 增加干扰:imageline增加线段,imagestring增加其他符号

  • 保存图片:imagepng输出或者保存图片

代码实现:

(这里用函数封装的方式实现,可以直接调用函数使用。) 

<?php
// 函数封装
/*
 *制作验证码图片
 *@param1 int $width,宽度
 *@param2 int $height,高度
 *@param3 int $length=4,字符宽度,默认四个
 *@param4 int $line,干扰线条
 *@param4 int $star,干扰星号
 */
function getCaptcha($width, $height, $length = 4, $line = 20, $star = 50)
{
//1.制作画布:画布的宽度,高度
    $img = imagecreatetruecolor($width, $height);
//2.背景色:默认背景颜色为黑色
    //2.1 分配颜色:让颜色能够在画布上使用,颜色是由0-255,数字越大,颜色越深,使用mt_rand函数实现颜色的随机显示
    $bg_color = imagecolorallocate($img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
    //2.2 填充上色(涂色):上色逻辑,找到一个点开始上色,系统自动匹配相邻点是否与当前上色点一致:一致一起渲染,不一致不上色
    imagefill($img, 0, 0, $bg_color);
//3.写入内容
    //求位置
    $start   = $width / ($length + 1);
    $captcha = '';
    for ($i = 0; $i < $length; $i++) {
        //随机得到写入内容
        switch (mt_rand(1, 3)) {
            case 1: //大写字母
                $captcha .= chr(mt_rand(97, 122));
                break;
            case 2: //小写字母
                $captcha .= chr(mt_rand(60, 90));
            case 3: //数字
                $captcha .= mt_rand(1, 9);
        }
        //字体颜色
        $font_color = imagecolorallocate($img, mt_rand(0, 50), mt_rand(0, 50), mt_rand(0, 50));
        //字体路径
        $font = "C:\Windows\Fonts\FZSTK.TTF";
        //输入文本
        imagettftext($img, mt_rand(20, 30), mt_rand(-45, 45), $start * ($i + 1), mt_rand($height / 2 - 10, $height / 2 + 20), $font_color, $font, $captcha[$i]);
    }
//4.增加干扰
    //4.1增加干扰点(*)
    for ($i = 0; $i < $star; $i++) {
        $dots_color = imagecolorallocate($img, mt_rand(140, 190), mt_rand(140, 190), mt_rand(140, 190));
        imagestring($img, 5, mt_rand(0, $width), mt_rand(0, $height), '*', $dots_color);
    }

//4.2干扰线
    for ($j = 0; $j < $line; $j++) {
        $lin_color = imagecolorallocate($img, mt_rand(50, $height), mt_rand(50, $height), mt_rand(50, $height));
        imageline($img, mt_rand(0, $width), mt_rand(0, $height), mt_rand(0, $width), mt_rand(0, $height), $lin_color);
    }
//5.保存输出
    //告知浏览器当前内容是图片
    header('Content-type:image/png');
    imagepng($img);
//6.销毁资源
    imagedestroy($img);
}
//调用函数
getCaptcha(200, 100);

运行结果: 

总结:

1,验证码指的是印在图片上的随机字符;

2,验证码图片的制作流程:画布->背景色->随机字符串->写入字符串->干扰->输出图片->销毁画布;

3,验证码的功能可以很丰富,需要使用更加复杂的函数和逻辑。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值