您好,登錄后才能下訂單哦!
這篇文章主要為大家詳細介紹了使用php怎么生成一個復雜的驗證碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,發現的小伙伴們可以參考一下:
php是一個嵌套的縮寫名稱,指的是英文超級文本預處理語言(php:Hypertext Preprocessor)的縮寫,它的語法混合了C、Java、Perl以及php自創新的語法,主要用來做網站開發,許多小型網站都用php開發,因為php是開源的,從而使得php經久不衰。
1、字體變型 (一般通過算法,進行扭曲)
2、字體黏貼 (這里面以qq驗證碼為代表了,目前網上還是很難找到,破解qq驗證碼的)
3、干擾線,噪點 (這種識別起來相當容易,很容易被程序自動化識別)
對于上面提到,第1,2 二種方法,在識別時候,是比較困難的。
具體實現代碼:
<?php /** *帶文字旋轉,傾斜,黏貼,加正弦干擾線驗證碼* */ class Utils_Caption { var $Width = 60; //圖片寬 var $Height = 30; //圖片高 var $Length = 4; //驗證碼位數 var $BgColor = "#FFFFFF"; //背景色 var $TFonts = array("font.ttf"); var $TFontSize=array(17,20); //字體大小范圍 var $TFontAngle=array(-20,20); //旋轉角度 var $Chars = "0123456789"; //驗證碼范圍(字母數字) var $Code = array(); //驗證碼 var $Image = ""; //圖形對象 var $FontColors=array('#f36161','#6bc146','#5368bd'); //字體顏色,紅綠藍 var $TPadden = 0.75;///字符間距,多少個字符 var $Txbase = 5;///x軸兩邊距離 var $Tybase =5 ;///y軸兩邊距離 var $TLine =true; ///畫干擾線 public function RandRSI() ///生成驗證碼 { $this->TFontAngle=range($this->TFontAngle[0],$this->TFontAngle[1]); $this->TFontSize=range($this->TFontSize[0],$this->TFontSize[1]); $arr=array(); $Chars=$this->Chars; $TFontAngle=$this->TFontAngle; $TFontSize=$this->TFontSize; $FontColors=$this->FontColors; $code=""; $font=dirname(__FILE__)."/font/".$this->TFonts[0]; $charlen=strlen($Chars)-1; $anglelen=count($TFontAngle)-1; // 角度范圍 $fontsizelen=count($TFontSize)-1; // 角度范圍 $fontcolorlen=count($FontColors)-1; // 角度范圍 for($i=0;$i<$this->Length;$i++) ///得到字符與顏色 { $char=$Chars[rand(0,$charlen)]; ///得到字符 $angle=$TFontAngle[rand(0,$anglelen)]; ///旋轉角度 $fontsize=$TFontSize[rand(0,$fontsizelen)]; ///字體大小 $fontcolor=$FontColors[rand(0,$fontcolorlen)]; ///字體大小 $bound=$this->_calculateTextBox($fontsize,$angle,$font,$char); ///得到范圍 $arr[]=array($fontsize,$angle,$fontcolor,$char,$font,$bound); ///得到矩形框 $code.=$char; } $this->Code=$arr; //驗證碼 return $code; } public function Draw() ///畫圖 { if(empty($this->Code)) $this->RandRSI(); $codes=$this->Code; ///用戶驗證碼 $wh=$this->_getImageWH($codes); $width=$wh[0]; $height=$wh[1]; ///高度 $this->Width=$width; $this->Height=$height; $this->Image = imageCreate( $width, $height ); $image=$this->Image; $back = $this->_getColor2($this->_getColor( $this->BgColor)); ///背景顏色 imageFilledRectangle($image, 0, 0, $width, $height, $back); ///填充背景 $TPadden=$this->TPadden; $basex=$this->Txbase; $color=null; foreach ($codes as $v) ///逐個畫字符 { $bound=$v[5]; $color=$this->_getColor2($this->_getColor($v[2])); imagettftext($image, $v[0], $v[1], $basex, $bound['height'],$color , $v[4], $v[3]); $basex=$basex+$bound['width']*$TPadden-$bound['left'];///計算下一個左邊距 } $this->TLine?$this->_wirteSinLine($color,$basex):null; ///畫干擾線 header("Content-type: image/png"); imagepng( $image); imagedestroy($image); } /** *通過字體角度得到字體矩形寬度* * * @param int $font_size 字體尺寸 * @param float $font_angle 旋轉角度 * @param string $font_file 字體文件路徑 * @param string $text 寫入字符 * @return array 返回長寬高 */ private function _calculateTextBox($font_size, $font_angle, $font_file, $text) { $box = imagettfbbox($font_size, $font_angle, $font_file, $text); $min_x = min(array($box[0], $box[2], $box[4], $box[6])); $max_x = max(array($box[0], $box[2], $box[4], $box[6])); $min_y = min(array($box[1], $box[3], $box[5], $box[7])); $max_y = max(array($box[1], $box[3], $box[5], $box[7])); return array( 'left' => ($min_x >= -1) ? -abs($min_x + 1) : abs($min_x + 2), 'top' => abs($min_y), 'width' => $max_x - $min_x, 'height' => $max_y - $min_y, 'box' => $box ); } private function _getColor( $color ) //#ffffff { return array(hexdec($color[1].$color[2]),hexdec($color[3].$color[4]),hexdec($color[5].$color[6])); } private function _getColor2( $color ) //#ffffff { return imagecolorallocate ($this->Image, $color[0], $color[1], $color[2]); } private function _getImageWH($data) { $TPadden=$this->TPadden; $w=$this->Txbase; $h=0; foreach ($data as $v) { $w=$w+$v[5]['width']*$TPadden-$v[5]['left']; $h=$h>$v[5]['height']?$h:$v[5]['height']; } return array(max($w,$this->Width),max($h,$this->Height)); } //畫正弦干擾線 private function _wirteSinLine($color,$w) { $img=$this->Image; $h=$this->Height; $h2=rand(-5,5); $h3=rand(-1,1); $w2=rand(10,15); $h4=rand(4,6); for($i=-$w/2;$i<$w/2;$i=$i+0.1) { $y=$h/$h4*sin($i/$w2)+$h/2+$h2; imagesetpixel($img,$i+$w/2,$y,$color); $h3!=0?imagesetpixel($img,$i+$w/2,$y+$h3,$color):null; } } }
DEMO代碼:
$rsi = new Utils_Caption(); $rsi->TFontSize=array(15,17); $rsi->Width=50; $rsi->Height=25; $code = $rsi->RandRSI(); session_start(); $_SESSION["CHECKCODE"] = $code; $rsi->Draw();
以上就是億速云小編為大家收集整理的使用php怎么生成一個復雜的驗證碼,如何覺得億速云網站的內容還不錯,歡迎將億速云網站推薦給身邊好友。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。