<?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