调试小技巧:当图片无法显示时,将header函数注释掉就可以看到报错信息了
字体文件放在当前文件目录的font文件夹中,windows的字体可以到C:\Windows\Fonts目录下复制过来,处理好文件名即可
关于GD库和面向对象的知识点可以看我前面几篇随笔,直接上代码了
<?php //验证码类 namespace vendor; class Captcha{ //制作验证码静态方法 /* * @param1 int $width = 450,验证码图片默认宽度 * @param2 int $height = 65,验证码图片默认高度 * @param3 int $length = 4,验证码默认字符数 * @param4 string $fonts = '',验证码字体,默认为空(内部使用默认字体) * @param5 int $level = 2,干扰素级别(1-3),级别越高越难辨认 */ public static function getCaptcha($width = 450,$height = 65,$length = 4,$fonts = '',$level = 2){ //判定字体资源 if(empty($fonts)) $fonts = 'verdana.ttf'; $fonts = __DIR__ . '/fonts/' . $fonts; //字体路径 //制作画布 $img = imagecreatetruecolor($width,$height); //分配背景色:随机浅色系 $bg_color = imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)); imagefill($img,0,0,$bg_color); //获取随机字符 $captcha = self::getString($length); //保存到session @session_start(); $_SESSION['captcha'] = $captcha; //写入图片 for($i = 0;$i < $length;$i++){ //增加颜色 $c_color = imagecolorallocate($img, mt_rand(0,60), mt_rand(0,60), mt_rand(0,60)); imagettftext($img, mt_rand(15,25), mt_rand(-45,45), $width/($length+1)*($i+1), mt_rand(25,$height-25), $c_color, $fonts, $captcha[$i]); } $interferon_level = $level ? ($level >= 1 && $level <= 3 ? $level: 2) : 2; //增加干扰点 $interferon_arr = array('*','(',')','~','^','=','-','+','#','&'); for($i = 0;$i < $interferon_level * 100;$i++){ $dots_color = imagecolorallocate($img,mt_rand(140,190),mt_rand(140,190),mt_rand(140,190)); imagestring($img,mt_rand(1,5),mt_rand(0,$width),mt_rand(0,$height),$interferon_arr[mt_rand(0,9)],$dots_color); } //增加干扰线 for($i = 0;$i < $interferon_level * 10;$i++){ $line_color = imagecolorallocate($img, mt_rand(80,130), mt_rand(80,130), mt_rand(80,130)); //制作线段 imageline($img,mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,$width),mt_rand(0,$height),$line_color); imagearc($img,mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,360),mt_rand(0,360),$line_color); } //输出资源 header('Content-type:image/png'); imagepng($img); imagedestroy($img); } //获取随机字符串 private static function getString($length = 4){ //定义变量保存数据 $captcha = ''; //循环随机获取数据 for($i = 0;$i < $length;$i++){ //随机确定数字、大写字母还是小写字母 switch(mt_rand(1,3)){ case 1: //数字:49-57分别代表1-9 $captcha .= chr(mt_rand(49,57)); break; case 2: //小写字母 $captcha .= chr(mt_rand(65,90)); break; case 3: //大写字母 $captcha .= chr(mt_rand(97,122)); break; } } //返回给调用处 return $captcha; } //验证验证码 public static function checkCaptcha($captcha){ //与session中存的进行对比 @session_start(); return (strtolower($captcha) === strtolower($_SESSION['captcha'])); } } //测试 Captcha::getCaptcha();