You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改现有PHP验证码代码实现多色效果?是否需额外库?

问题:为PHP验证码实现多色效果,无需额外库

不需要使用额外库,仅需对现有代码做少量修改,就能让验证码的字符、噪点、线条呈现不同颜色,提升美观度和抗机器识别能力。

修改要点

  • 放弃统一的文本/噪点颜色,改为随机生成RGB颜色
  • 不再一次性绘制所有验证码字符,改为逐个绘制,每个字符使用独立的随机颜色
  • 噪点(圆点和线条)也使用随机颜色,增强干扰性

修改后的完整代码

<?php
session_start();
// 自定义验证码配置
$captcha_code = '';
$captcha_image_height = 50;
$captcha_image_width = 130;
$total_characters_on_image = 6;

// 避免易混淆字符
$possible_captcha_letters = 'bcdfghjkmnpqrstvwxyz23456789';
$captcha_font = './monofont.ttf';

$random_captcha_dots = 45;
$random_captcha_lines = 20;

// 生成验证码字符串
$count = 0;
while ($count < $total_characters_on_image) { 
    $captcha_code .= substr(
        $possible_captcha_letters,
        mt_rand(0, strlen($possible_captcha_letters)-1),
        1);
    $count++;
}

$captcha_font_size = $captcha_image_height * 0.65;
$captcha_image = @imagecreate($captcha_image_width, $captcha_image_height);

// 设置背景色
$background_color = imagecolorallocate($captcha_image, 255, 255, 255);

// 生成随机RGB颜色的工具函数
function getRandomColor($image) {
    return imagecolorallocate(
        $image,
        mt_rand(30, 180), // 限制亮度,避免和白色背景对比度不足
        mt_rand(30, 180),
        mt_rand(30, 180)
    );
}

// 生成随机彩色噪点圆点
for($count=0; $count<$random_captcha_dots; $count++ ) {
    imagefilledellipse(
        $captcha_image,
        mt_rand(0,$captcha_image_width),
        mt_rand(0,$captcha_image_height),
        2,
        3,
        getRandomColor($captcha_image)
    );
}

// 生成随机彩色干扰线条
for($count=0; $count<$random_captcha_lines; $count++ ) {
    imageline(
        $captcha_image,
        mt_rand(0,$captcha_image_width),
        mt_rand(0,$captcha_image_height),
        mt_rand(0,$captcha_image_width),
        mt_rand(0,$captcha_image_height),
        getRandomColor($captcha_image)
    );
}

// 逐个绘制验证码字符,每个字符用随机颜色+微小角度偏移
$x_start = ($captcha_image_width - ($captcha_font_size * $total_characters_on_image * 0.7)) / 2;
$y = ($captcha_image_height + $captcha_font_size * 0.3) / 2;

for($i=0; $i<$total_characters_on_image; $i++) {
    $char = $captcha_code[$i];
    $angle = mt_rand(-10, 10);
    imagettftext(
        $captcha_image,
        $captcha_font_size,
        $angle,
        $x_start + ($i * $captcha_font_size * 0.7),
        $y,
        getRandomColor($captcha_image),
        $captcha_font,
        $char
    );
}

// 输出图片
header('Content-Type: image/jpeg'); 
imagejpeg($captcha_image);
imagedestroy($captcha_image);
$_SESSION['captcha'] = $captcha_code;
?>

修改说明

  1. 新增getRandomColor函数,生成随机深色RGB值,确保和白色背景有足够对比度
  2. 噪点圆点和线条改为调用该函数获取随机颜色,替代原统一颜色
  3. 循环逐个绘制验证码字符,每个字符使用独立随机颜色,同时添加微小角度偏移,进一步提升抗机器识别能力
  4. 调整字符起始位置和间距,保证多字符排版更合理

内容的提问来源于stack exchange,提问作者Program

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:21:11