//@Constructor 构造函数 public function Captcha(){ $this->textNum=4; $this->fontSize=16; $this->fontFamily="c:windowsfontsSIMYOU.ttf";//设置中文字体,可以改成linux的目录 $this->textLang="en"; $this->noisePoint=30; $this->noiseLine=3; $this->distortion=false; $this->showBorder=false; }
//@设置图片宽度 public function setWidth($w){ $this->width=$w; }
//@设置图片高度 public function setHeight($h){ $this->height=$h; }
//@设置字符个数 public function setTextNumber($textN){ $this->textNum=$textN; }
//@设置字符颜色 public function setFontColor($fc){ $this->fontColor=sscanf($fc,"#%2x%2x%2x"); }
//@设置字号 public function setFontSize($n){ $this->fontSize=$n; }
//@设置字体 public function setFontFamily($ffUrl){ $this->fontFamily=$ffUrl; }
//@设置字符语言 public function setTextLang($lang){ $this->textLang=$lang; }
//@设置图片背景 public function setBgColor($bc){ $this->bgColor=sscanf($bc,"#%2x%2x%2x"); }
//@设置干扰点数量 public function setNoisePoint($n){ $this->noisePoint=$n; }
//@设置干扰线数量 public function setNoiseLine($n){ $this->noiseLine=$n; }
//@设置是否扭曲 public function setDistortion($b){ $this->distortion=$b; }
//@设置是否显示边框 public function setShowBorder($border){ $this->showBorder=$border; }
//@初始化验证码图片 public function initImage(){ if(empty($this->width)){$this->width=floor($this->fontSize*1.3)*$this->textNum+10;} if(empty($this->height)){$this->height=$this->fontSize*2;} $this->image=imagecreatetruecolor($this->width,$this->height); if(empty($this->bgColor)){ $this->randBgColor=imagecolorallocate($this->image,mt_rand(100,255),mt_rand(100,255),mt_rand(100,255)); }else{ $this->randBgColor=imagecolorallocate($this->image,$this->bgColor[0],$this->bgColor[1],$this->bgColor[2]); } imagefill($this->image,0,0,$this->randBgColor); }
//@产生随机字符 public function randText($type){ $string=""; switch($type){ case "en": $str="ABCDEFGHJKLMNPQRSTUVWXY3456789"; for($i=0;$i<$this->textNum;$i++){ $string=$string.",".$str[mt_rand(0,29)]; } break; case "cn": for($i=0;$i<$this->textNum;$i++) { $string=$string.",".chr(rand(0xB0,0xCC)).chr(rand(0xA1,0xBB)); } $string=iconv("GB2312","UTF-8",$string); //转换编码到utf8 break; } return substr($string,1); }
//@输出文字到验证码 public function createText(){ $textArray=explode(",",$this->randText($this->textLang)); $this->textContent=join("",$textArray); if(empty($this->fontColor)){ $this->randFontColor=imagecolorallocate($this->image,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100)); }else{ $this->randFontColor=imagecolorallocate($this->image,$this->fontColor[0],$this->fontColor[1],$this->fontColor[2]); } for($i=0;$i<$this->textNum;$i++){ $angle=mt_rand(-1,1)*mt_rand(1,20); imagettftext($this->image,$this->fontSize,$angle,5+$i*floor($this->fontSize*1.3),floor($this->height*0.75),$this->randFontColor,$this->fontFamily,$textArray[$i]); } }
//@生成干扰点 public function createNoisePoint(){ for($i=0;$i<$this->noisePoint;$i++){ $pointColor=imagecolorallocate($this->image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); imagesetpixel($this->image,mt_rand(0,$this->width),mt_rand(0,$this->height),$pointColor); }
}
//@产生干扰线 public function createNoiseLine(){ for($i=0;$i<$this->noiseLine;$i++) { $lineColor=imagecolorallocate($this->image,mt_rand(0,255),mt_rand(0,255),20); imageline($this->image,0,mt_rand(0,$this->width),$this->width,mt_rand(0,$this->height),$lineColor); } }
//@扭曲文字 public function distortionText(){ $this->distortionImage=imagecreatetruecolor($this->width,$this->height); imagefill($this->distortionImage,0,0,$this->randBgColor); for($x=0;$x<$this->width;$x++){ for($y=0;$y<$this->height;$y++){ $rgbColor=imagecolorat($this->image,$x,$y); imagesetpixel($this->distortionImage,(int)($x+sin($y/$this->height*2*M_PI-M_PI*0.5)*3),$y,$rgbColor); } } $this->image=$this->distortionImage; }