PHP 使用 GD 库生成包含数字和字母的随机验证码图片
利用 PHP 内置的 GD 图像处理函数,可以无需安装额外扩展即可生成标准的验证码图片。核心逻辑涵盖画布创建、随机字符提取与渲染、以及干扰元素(噪点和线条)的绘制。
结果与目标
生成的图片需满足以下特征:
- 格式为 PNG,尺寸约为 100x30 像素。
- 背景为白色,文字颜色随机。
- 内容包含 4 位随机组合的数字或小写字母。
- 画面中包含散落的干扰点阵及横向干扰线,防止简单 OCR 识别。
准备条件
- 服务器已启用 PHP 环境。
- PHP 配置中已加载
gd扩展,可通过phpinfo()查看是否包含 GD 模块信息。
真实操作顺序
第1步:初始化 HTTP 响应头与画布
首先设置 Header 告知浏览器该响应是图片数据,然后在内存中创建一个真彩色图像资源作为载体。
<?php
header('Content-Type: image/png');
// 创建 100x30 像素的真彩色图像
$image = imagecreatetruecolor(100, 30);
// 分配白色背景色 (R=255, G=255, B=255)
$color = imagecolorallocate($image, 255, 255, 255);
// 填充背景
imagefill($image, 0, 0, $color);
?>
第2步:提取随机字符并写入图像
构建一个包含数字和小写字母的字符串池,通过循环随机抽取 4 个字符,并使用 imagestring 将其绘制在画布上。每个字符的位置会在 X 轴固定偏移基础上增加 Y 轴随机抖动。
<?php
// 定义可用字符集
$data = 'abcdefghijklmnopqrstuvwxyz123456789';
for ($i = 0; $i < 4; $i++) {
// 获取单个随机字符
$char = substr($data, rand(0, strlen($data) - 1), 1);
// 计算坐标:X 轴均匀分布,Y 轴小幅随机波动
$x = 5 + $i * 22; // 100/4 ≈ 25, 减去边距约 22
$y = rand(5, 15);
// 随机分配前景色
$fontColor = imagecolorallocate($image, rand(0, 120), rand(0, 120), rand(0, 120));
// 字体大小为 6
imagestring($image, 6, $x, $y, $char, $fontColor);
}
?>
第3步:添加干扰元素
为了防止自动化脚本轻易破解,需要向图像中添加视觉噪音。这包括随机颜色的像素点和大致横跨画面的直线。
<?php
// 添加 200 个随机像素点作为干扰
for ($i = 0; $i < 200; $i++) {
$pointColor = imagecolorallocate($image, rand(100, 255), rand(100, 255), rand(100, 255));
imagesetpixel($image, rand(0, 100), rand(0, 30), $pointColor);
}
// 添加 2 条随机位置的线条
for ($i = 0; $i < 2; $i++) {
$lineColor = imagecolorallocate($image, rand(150, 255), rand(150, 255), rand(150, 255));
// 随机指定线段起点和终点
imageline($image, rand(0, 100), rand(0, 30), rand(0, 100), rand(0, 30), $lineColor);
}
?>
第4步:输出图像并释放资源
将处理好的图像以 PNG 格式输出到浏览器,随后销毁内存中的图像对象以避免泄漏。
<?php
imagepng($image);
imagedestroy($image);
?>
简要总结
通过组合使用 PHP 的 GD 基础绘图函数,可以快速构建基础的防机器人输入验证机制。虽然此方法未进行复杂的扭曲或字体旋转,但对于一般场景下的低频请求拦截具有即插即用的效果。以上就是使用 PHP 生成数字字母混合验证码图片的详细内容,更多关于 PHP 图形处理及验证码技术的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









