基於GD庫的php驗證碼類(支援中英文字型、背景、幹擾點線、扭曲.......)
<?php/** Captcha Class base on PHP GD Lib* @author Design* @version 1.0* @copyright js8.in 2010* @demo* include('captchaClass.php');* $captchaDemo=new Captcha();* $captchaDemo->createImage();*/class Captcha{//@定義驗證碼圖片高度private $height;//@定義驗證碼圖片寬度private $width;//@定義驗證碼字元個數private $textNum;//@定義驗證碼字元內容private $textContent;//@定義字元顏色private $fontColor;//@定義隨機出的文字顏色private $randFontColor;//@定義字型大小private $fontSize;//@定義字型private $fontFamily;//@定義背景顏色private $bgColor;//@定義隨機出的背景顏色private $randBgColor;//@定義字元語言private $textLang;//@定義幹擾點數量private $noisePoint;//@定義幹擾線數量private $noiseLine;//@定義是否扭曲private $distortion;//@定義扭曲圖片源private $distortionImage;//@定義是否有邊框private $showBorder;//@定義驗證碼圖片源private $image;//@Constructor 建構函式public function Captcha(){$this->textNum = 4;$this->fontSize = 16;$this->fontFamily = 'c:\windows\fontsSIMYOU.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); //轉換編碼到utf8break;}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;}//@產生驗證碼圖片public function createImage(){$this->initImage(); //建立基本圖片$this->createText(); //輸出驗證碼字元if ($this->distortion) {$this->distortionText();} //扭曲文字$this->createNoisePoint(); //產生幹擾點$this->createNoiseLine(); //產生幹擾線if ($this->showBorder) {imagerectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $this->randFontColor);} //添加邊框imagepng($this->image);imagedestroy($this->image);if ($this->distortion) {imagedestroy($this->$distortionImage);}return $this->textContent;}}?>
使用方法:
<?php//session_start();header("Content-type:image/png");include('captcha5_class.php');$captcha5 = new Captcha();//@設定驗證碼寬度//$captcha5->setWidth(200);//@設定驗證碼高度//$captcha5->setHeight(50);//@設定字元個數$captcha5->setTextNumber(5);//@設定字元顏色//$captcha5->setFontColor('#ff9900');//@設定字型大小大小//$captcha5->setFontSize(25);//@設定字型$captcha5->setFontFamily('c:\windows\fonts\STXINGKA.TTF');//@設定語言$captcha5->setTextLang('cn');//@設定背景顏色//$captcha5->setBgColor('#000000');//@設定幹擾點數量//$captcha5->setNoisePoint(600);//@設定幹擾線數量//$captcha5->setNoiseLine(10);//@設定是否扭曲//$captcha5->setDistortion(true);//@設定是否顯示邊框$captcha5->setShowBorder(true);//輸出驗證碼$code = $captcha5->createImage();//$_SESSION['captchaCode']['content']=$code;//$_SESSION['captchaCode']['time']=microtime();?>