PHP使用GD库制作验证码

PHP使用GD库制作验证码

验证码

  1. 什么是验证码?
    验证码是一种区分用户是计算机还是人的公共全自动程序
  2. 为什么要使用验证码?
    可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试
  3. 如何制作验证码?
    制作验证码需要两种技术:
    一、图片处理技术
    二、会话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(画布);

制作验证码案例

需求:

  1. 使用GD技术制作验证码
  2. 验证码使用数字、大小写字母组成
  3. 添加干扰线及干扰点
  4. 验证码字符不能紧凑
    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;"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐水莲心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值