PHP使用GD库制作验证码
验证码
- 什么是验证码?
验证码是一种区分用户是计算机还是人的公共全自动程序 - 为什么要使用验证码?
可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试 - 如何制作验证码?
制作验证码需要两种技术:
一、图片处理技术
二、会话session技术
开启GD扩展
PHP 图片处理技术-GD
要想使用GD技术,现要开启GD技术。查看PHP有没有开启GD扩展方法:
一、编写phpinfo.php
<?php
phpinfo();
配置好PHP的开发环境,在浏览器中打开此页面即可查看。如下图:
二、打开PHP中的配置文件php.ini
在这文件里“;”代表注释,因此要想开启一个扩展只需去掉";",重启Apache或Nginx即可。
使用GD技术
创建画布
什么是画布?
画布,一种资源型数据。可以操作的图像资源。
新建画布:
ImageCreate(宽,高),创建基于调色板的画布。
imageCreateTrueColor(宽,高);创建真彩色的画布。
基于图片创建画布(打开)
imageCreateFromJPEG(图片地址);
imageCreateFromPNG(图片地址);
imageCreateFromGIF(图片地址);
操作画布
分配颜色:如果需要在画布上使用某个颜色,应该先将颜色分配到画布上。
使用函数:
颜色标识 = imageColorAllocate(画布,R,G,B);
填充画布:将填充点,连续并且颜色相同的点进行填充(替换)
函数:imagefill(画布, 填充位置x, 填充位置Y,颜色标识)
位置采用坐标进行管理:
原点:0,0,画布的左上角。
向右,x轴增加,向下Y轴增加。
右下角坐标:width-1,height-1
输出画布
将画布中处理好的图样信息输出
输出函数:
imagePNG(画布[, 文件地址]):
imageJPEG(画布[, 文件地址]);
imageGIF(画布[, 文件地址]);
注意:如果没有第二个参数,表示直接输出。一个画布可以输出多次,输出为各种格式!
如果直接输出到浏览器,需要告知浏览器,响应数据的类型应该是PNG格式的图片:使用指令Content-type
销毁画布
函数:imagedestroy(画布);
制作验证码案例
需求:
- 使用GD技术制作验证码
- 验证码使用数字、大小写字母组成
- 添加干扰线及干扰点
- 验证码字符不能紧凑
captcha.php代码实现如下:
/**
* 制作验证码
*/
// 1,创建画布
$img = imagecreatetruecolor(180, 40);
// 2, 填充背景色
$backcolor = imagecolorallocate($img, mt_rand(200,255), mt_rand(150,255), mt_rand(200,255));
imagefill($img, 0, 0, $backcolor);
// 3, 产生随机验证码字符串
$arr = array_merge( range('a', 'z'), range('A', 'Z'),range(0, 9));
shuffle($arr);
$rand_keys = array_rand($arr, 4);
$str = '';
foreach ($rand_keys as $value) {
$str .= $arr[$value];
}
// 保存到session变量中
session_start();
$_SESSION['captcha'] = $str;
// 4, 绘制文字
// 计算字符间距
$span = floor(180/(4+1));
for($i=1;$i<=4;$i++) {
$stringcolor = imagecolorallocate($img, mt_rand(0,255), mt_rand(0,100), mt_rand(0,80));
imagestring($img, 5, $i*$span, 12, $str[$i-1], $stringcolor);
}
// 5,添加干扰线
for($i=1;$i<=6;$i++) {
$linecolor = imagecolorallocate($img, mt_rand(0,150), mt_rand(30,250), mt_rand(200,255));
imageline($img,mt_rand(0,179),mt_rand(0,39),mt_rand(0,179),mt_rand(0,39),$linecolor);
}
// 6,添加干扰点
for($i=1;$i<=180*40*0.02;$i++) {
$pixelcolor = imagecolorallocate($img, mt_rand(100,150), mt_rand(0,120), mt_rand(0,255));
imagesetpixel($img, mt_rand(0,179),mt_rand(0,39), $pixelcolor);
}
// 7,输出图片
// 设置响应头信息
header("Content-type:image/png");
// 清理数据缓冲区
ob_clean();
imagepng($img);// 输出图片
// 8,销毁图片(释放资源)
imagedestroy($img);
// 使用方法:
// <img src="captcha.php" οnclick="this.src='captcha.php'" alt="看不清?点击更换另一个验证码" style="cursor:pointer;"/>