PHP如何生成验证码图片?

2025-12发布14次浏览

在PHP中生成验证码图片通常涉及几个步骤:创建画布、生成随机字符、在画布上绘制字符、添加干扰元素以及输出图片。下面是一个简单的示例,演示如何生成一个包含随机字母和数字的验证码图片。

<?php
session_start(); // 启动会话

// 设置图片的宽度和高度
$width = 120;
$height = 40;

// 创建一个画布(图像资源)
$image = imagecreatetruecolor($width, $height);

// 分配颜色
$background_color = imagecolorallocate($image, 255, 255, 255); // 白色背景
$font_color = imagecolorallocate($image, 0, 0, 0); // 黑色字体

// 填充背景色
imagefilledrectangle($image, 0, 0, $width, $height, $background_color);

// 生成随机验证码字符串
$captcha_code = '';
for ($i = 0; $i < 6; $i++) {
    $captcha_code .= dechex(mt_rand(0, 255));
}

// 将验证码字符串保存到会话中,用于之后的验证
$_SESSION['captcha'] = $captcha_code;

// 在画布上绘制验证码
$font_file = './arial.ttf'; // 字体文件路径
$x = 10;
$y = 30;
imagettftext($image, 20, 0, $x, $y, $font_color, $font_file, $captcha_code[$i]);

// 添加干扰元素,如线条
for ($i = 0; $i < 5; $i++) {
    $line_color = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
    imageline($image, mt_rand(0, $width), mt_rand(0, $height), mt_rand(0, $width), mt_rand(0, $height), $line_color);
}

// 添加干扰元素,如圆点
for ($i = 0; $i < 50; $i++) {
    $dot_color = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
    imagefilledellipse($image, mt_rand(0, $width), mt_rand(0, $height), 2, 2, $dot_color);
}

// 输出图片
header('Content-Type: image/png');
imagepng($image);

// 释放画布资源
imagedestroy($image);
?>

这段代码首先创建了一个白色的画布,并生成一个随机的6位十六进制数作为验证码。然后,它在画布上绘制这个验证码,并添加了一些线条和圆点作为干扰元素。最后,它以PNG格式输出图片,并释放了画布资源。

请注意,这个示例假设你有一个名为arial.ttf的字体文件在你的服务器上,用于绘制验证码文本。你需要根据实际情况调整字体文件的路径。