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();