class Captcha{ ???//验证码宽 ???private $width; ???//验证码高度 ???private $height; ???//验证码长度 ???private $len; ???//验证码范围 ???private $str = ?"abcdefghijkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; ???//字体地址 ???private $font_dir = ‘F:\phpStudy\PHPTutorial\WWW\php\code\4.ttf‘; ???//验证码资源 ???private $img; ???//验证码字符串 ???private $code; ???public function __construct($config=[‘width‘=>200,‘height‘=>50,‘len‘=>4]){ ???????$this->width=$config[‘width‘]; ???????$this->height=$config[‘height‘]; ???????$this->len=$config[‘len‘]; ???} ???public function entry(){ ???????$this->createBg(); ???????$this->getCode(); ???????$this->setCode(); ???????$this->setLine(); ???????$this->setDot(); ???????$this->setBg(); ???} ???//生成画布 ???private function createBg(){ ???????$this->img = imagecreate($this->width,$this->height); ???????//分配验证码的背景颜色 ???????imagecolorallocate($this->img,255,255,255); ???} ???//生成随机字符串 ???private function getCode(){ ???????for($i=0;$i<$this->len;$i++){ ???????????$key = mt_rand(0,strlen($this->str)-1); ???????????$this->code .= $this->str[$key]; ???????} ???????$this->setSession(); ???} ???//把验证码存入session之后和用户输入的验证码做比较 ???private function setSession(){ ???????session_start(); ???????$_SESSION[‘code‘]=strtolower($this->code); ???} ???//输出验证码到画布 ???private function setCode(){ ???????for($i=0;$i<$this->len;$i++){ ???????????$font_color = imagecolorallocate($this->img,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100)); ???????????$x = ($this->width/$this->len)*$i+5; ???????????$fontSize = mt_rand(18,28); ???????????$fontHeight=imagefontheight($fontSize); ???????????$y= ?mt_rand($fontHeight+5,$this->height); ???????????imagettftext($this->img, $fontSize, mt_rand(-25,25), $x, $y, $font_color, $this->font_dir,$this->code[$i]); ???????} ???} ???//画干扰线 ???private function setLine(){ ???????for ($i=0; $i <$this->len ; $i++) { ????????????$line_color = imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); ???????????imageline($this->img, mt_rand(0,$this->width/$this->len), mt_rand(0,$this->height), mt_rand($this->width-$this->width/$this->len,$this->width), ?mt_rand(0,$this->height), $line_color); ???????} ???} ???//画干扰点到画布 ???private function setDot(){ ???????for ($i=0; $i < $this->width ; $i++) { ????????????$dot_color = imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); ???????????imagesetpixel($this->img, mt_rand(0,$this->width), mt_rand(0,$this->height), $dot_color); ???????} ???} ???//输出成图像 ???private function setBg(){ ???????ob_end_clean(); ???????header(‘content-type:image/jpeg‘); ???????imagejpeg($this->img); ???} ???public function __destruct(){ ???????imagedestroy($this->img); ???}}
//输出验证码
$captcha = new Captcha();
$captcha->entry();
PHP验证码类
原文地址:http://blog.51cto.com/woaijorden/2152267