1 <?php 2 class Captcha { 3 public $width = 100; 4 public $height = 20; 5 public $code_len = 4; 6 7 public $pixel_number = 100; 8 9 private function _mkCode() { 10 // 有4位,大写字母和数字组成 11 // 思路,将所有的可能性,做一个集合。随机(依据某种条件)进行选择。 12 // 所有的可能的字符集合 13 $chars = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789'; 14 $chars_len = strlen($chars);// 集合长度 15 // 随机选取 16 $code = '';// 验证码值初始化 17 for($i=0; $i<$this->code_len; ++$i) { 18 // 随机取得一个字符下标 19 $rand_index = mt_rand(0, $chars_len-1); 20 // 利用字符串的下标操作,获得所选择的字符 21 $code .= $chars[$rand_index]; 22 } 23 // 存储于session中 24 @session_start(); 25 $_SESSION['captcha_code'] = $code; 26 return $code; 27 28 } 29 /** 30 * 生成验证码图片 31 * @param int $code_len 码值长度 32 */ 33 public function makeImage() { 34 // 一:处理码值,这里我们添加了一个函数 _mkCode()生成随机的验证码 35 $code = $this->_mkCode(); 36 37 // 二,处理图像 38 // 创建画布 39 $image = imagecreatetruecolor($this->width, $this->height); 40 // 设置背景颜色[背景就会是随机] 41 $bg_color = imagecolorallocate($image, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255)); 42 // 填充背景 43 imagefill($image, 0, 0, $bg_color); 44 45 // 分配字体颜色,随机分配,黑色或者白色 46 if (mt_rand(0, 1) == 1) { 47 $str_color = imagecolorallocate($image, 0, 0, 0);// 黑色 48 } else { 49 // 整数支持 不同进制表示 50 $str_color = imagecolorallocate($image, 255, 0xff, 255);// 白色 51 } 52 // 内置5号字体 53 $font = 5; 54 // 位置 55 // 画布大小 56 $image_w = imagesx($image); 57 $image_h = imagesy($image); 58 // 字体宽高 59 $font_w = imagefontwidth($font); 60 $font_h = imagefontheight($font); 61 // 字符串宽高 62 $str_w = $font_w * $code_len; 63 $str_h = $font_h; 64 // 计算位置[把我们字符串在中间] 65 $str_x = ($image_w - $str_w) / 2 - 20; 66 $str_y = ($image_h-$str_h) / 2; 67 // 字符串 68 imagestring($image, $font, $str_x, $str_y, $code, $str_color); 69 70 // 设置干扰 71 for($i=1; $i<=$this->pixel_number; ++$i) { 72 $color = imagecolorallocate($image, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200)); 73 imagesetpixel($image, mt_rand(0, $this->width-1), mt_rand(0,$this->height-1), $color); 74 } 75 76 // 输出,销毁画布 77 //ob_clean(),清空缓存,保证正确输出. 78 ob_clean(); 79 header('Content-Type: image/jpeg'); 80 imagejpeg($image); 81 imagedestroy($image); 82 } 83 84 }