GD庫 驗證碼類的封裝

慕課網後 端開發PHP教程-->PHP進階篇--GD庫圖像處理-->http://www.imooc.com/learn/701-->2-6 驗證碼類的封裝

<?php
header("content-type:text/html;charset=utf-8");
//error_reporting(0);
Class Captcha{
	//字體文件
	private $_fontfile='';
	//字體大小
	private $_size=20;
	//畫布寬度
	private $_width=120;
	//畫布高度
	private $_height=40;
	//驗證碼長度
	private $_length=4;
	//干擾元素
	//雪花*的個數
	private $_snow=0;
	//像素個數
	private $_pixel=0;
	//線段個數
	private $_line=0;

	//畫布資源
	private $_image=null;

	//初始化數據
	public function __construct ($config=array()){

		if(is_array($config)&&count($config)>0){
			//檢測字體文件是否存在並且可讀
			if(isset($config['fontfile'])&&is_file($config['fontfile'])&&is_readable($config['fontfile'])){
				$this->_fontfile=$config['fontfile'];
			}else{
				return false;
			}
			//檢測是否設置字體大小
			if(isset($config['size'])&&$config['size']>0){
				$this->_size=(int)$config['size'];
			}
			//檢測是否設置畫布寬和高
			if(isset($config['width'])&&$config['width']>0){
				$this->_width=(int)$config['width'];
			}
			if(isset($config['height'])&&$config['height']>0){
				$this->_height=(int)$config['height'];
			}
			//檢測是否設置驗證碼長度
			if(isset($config['length'])&&$config['length']>0){
				$this->_length=(int)$config['length'];
			}
			//配置干擾元素
			if(isset($config['snow'])&&$config['snow']>0){
				$this->_snow=(int)$config['snow'];
			}
			if(isset($config['pixel'])&&$config['pixel']>0){
				$this->_pixel=(int)$config['pixel'];
			}
			if(isset($config['line'])&&$config['line']>0){
				$this->_line=(int)$config['line'];
			}

			
			$this->_image=imagecreatetruecolor($this->_width,$this->_height);
			return $this->_image;

		}else{
			return false;
		}
	}
	//得到驗證碼
	public function getCaptcha(){
		$white=imagecolorallocate($this->_image,255,255,255);
		//填充矩形
		imagefilledrectangle($this->_image,0,0,$this->_width,$this->_height,$white);
		//生成驗證碼
		$str=$this->_generateSre($this->_length);
		if(false===$str){
			return false;
		}
		//繪製驗證碼
		$size=$this->_size;
		$fontfile=$this->_fontfile;
		for($i=0;$i<$this->_length;$i++){
			$angle=mt_rand(-15,15);
			$x=ceil($this->_width/$this->_length)*$i+mt_rand(5,10);
			$y=ceil($this->_height/1.5);
			$color=$this->_getRandColor();
			$text=$str[$i];
			imagettftext($this->_image,$size,$angle,$x,$y,$color,$fontfile,$text);
		}

		//像素和線段
		if($this->_snow){
			//使用雪花當做干擾元素
			$this->_getSnow();
		}else{
			if($this->_pixel){
				$this->_getPixel();
			}
			if($this->_line){
				$this->_getLine();
			}
		}
		//echo $str;exit;
		//輸出圖像
		header("content-type:image/png");
		imagepng($this->_image);
		imagedestroy($this->_image);
		return strtolower($str);
	}
	//產生雪花
	private function _getSnow(){
		for($i=1;$i<=$this->_snow;$i++){
			$color=$this->_getRandColor();
			imagestring($this->_image,mt_rand(1,5),mt_rand(0,$this->_width),mt_rand(0,$this->_height),'*',$color);
		}
	}
	//繪製像素
	private function _getPixel(){
		for($i=1;$i<=$this->_pixel;$i++){
			$color=$this->_getRandColor();
			imagesetpixel($this->_image,mt_rand(0,$this->_width),mt_rand(0,$this->_height),$color);
		}
	}
	//繪製線段
	private function _getLine(){
		for($i=1;$i<=$this->_line;$i++){
			$color=$this->_getRandColor();
			imageline($this->_image,mt_rand(0,$this->_width),mt_rand(0,$this->_height),mt_rand(0,$this->_width),mt_rand(0,$this->_height),$color);
		}
	}

	//產生驗證碼字符
	private function _generateSre($length=4){
		if($length<1||$length>30){
			return false;
		}
		$chars=array(
			'a','b','c','d','e','f','g','h','k','m','n','p','r','s','t','u','v','w','x','y','z',
			'A','B','C','D','E','F','G','H','K','M','N','P','Q','R','S','T','U','V','W','X','Y','Z',
			1,2,3,4,5,6,7,8,9
		);
		$str=str_shuffle(join('',array_rand(array_flip($chars),$length)));
		return $str;
	}
	//產生隨機顏色
	private function _getRandColor(){
		return imagecolorallocate($this->_image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
	}
}


?>


測試使用

<?php
include("Captcha.class.php");

$config=array(
	'fontfile'=>'fonts/7.ttf',
	'pixel'=>100,
	'line'=>5
	);

$captcha=new Captcha($config);
session_start();
$_SESSION['verifyCode']=$captcha->getCaptcha();

?>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章