生成验证码图片

<?php
/**
 * 输出验证码图片
 *
 * @param string $type 类型:image=图片|text=文本(base64)
 * @return string|null 若$type值为text则返回图片的base64编码,否则直接显示图片无返回值
 * @throws Exception
 */
function captcha(string $type = 'image'): ?string
{
    $width = 233; // 验证码图片宽度,单位:像素
    $height = 70; // 验证码图片高度,单位:像素
    $length = 8; // 验证码长度(字符数)
    $size = 24; // 验证码字符的字体大小
    $font = __DIR__ . '/Inkfree.ttf'; // 字体文件路径

    // 检查字体文件是否存在
    if (!file_exists($font)) {
        exit("字体文件[$font]不存在");
    }

    // 随机生成验证码字符
    $char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
    $code = substr(str_shuffle($char), 0, $length);

    // 获取随机颜色函数
    $random = static function ($image) {
        $red = random_int(0, 255);
        $green = random_int(0, 255);
        $blue = random_int(0, 255);
        return imagecolorallocate($image, $red, $green, $blue);
    };

    // 创建验证码图片(此时为空图片)
    $image = imagecreatetruecolor($width, $height);

    // 设置验证码图片底色(黑色)
    imagefill($image, 0, 0, imagecolorallocate($image, 0, 0, 0));

    // 逐个字符画出验证码
    for ($i = 0; $i < $length; $i++) {
        $angle = random_int(-25, 25); // 随机倾斜
        $x = $size * ($i + 1); // X轴偏移量
        imagettftext($image, $size, $angle, $x, 46, $random($image), $font, $code[$i]);
    }

    // 画干扰线
    for ($i = 0; $i < 5; $i++) {
        $x1 = random_int(0, $width);
        $y1 = random_int(0, $height);
        $x2 = random_int(0, $width);
        $y2 = random_int(0, $height);
        imageline($image, $x1, $y1, $x2, $y2, $random($image));
    }

    // 直接显示图片然后exit
    if ($type === 'image') {
        header('Content-Type: image/png');
        imagepng($image);
        imagedestroy($image);
        exit;
    }

    // 返回图片的base64编码
    ob_start();
    imagepng($image);
    imagedestroy($image);
    $contents = ob_get_clean();

    // 拼接上前缀,最终返回的字符串可以直接复制到浏览器地址栏查看图片
    return 'data:image/png;base64,' . base64_encode($contents);
}


//========== 直接输出图片 ==========//
try {
    captcha();
} catch (Exception $e) {
    exit('Exception: ' . $e->getMessage());
}


//========== 输出base64编码 ==========//
try {
    $base64 = captcha('text');
} catch (Exception $e) {
    exit('Exception: ' . $e->getMessage());
}

if (isset($base64)) {
    echo $base64;
}

Copyright © 2024 码农人生. All Rights Reserved