引入:
定义:验证码(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,验证码的功能可以很丰富,需要使用更加复杂的函数和逻辑。