熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

php 驗證碼(傾斜,正弦干擾線,黏貼,旋轉)

2013-11-15 12:34:53  來源: PHP編程 

  字體變型 (一般通過算法進行扭曲比較有代表性就是

  php 驗證碼(傾斜,正弦干擾線,黏貼,旋轉)

  字體黏貼 (這裡面以qq驗證碼為代表了目前網上還是很難找到破解qq驗證碼的)

  image

  干擾線噪點 (這種識別起來相當容易很容易被程序自動化識別)

  

  對於上面提到 二種方法在識別時候是比較困難的個人比較喜歡第二種方法感覺看起來不是很費力而扭曲的文字總覺得怪怪的 哈哈純粹個人喜好了

  

  

  實現代碼

  <?php /** *帶文字旋轉傾斜黏貼加正弦干擾線驗證碼* *@version *@author *@copyright 程默 QQ: */ class Utils_Caption { var $Width = ; //圖片寬 var $Height = ; //圖片高 var $Length = ; //驗證碼位數 var $BgColor = "#FFFFFF"; //背景色 var $TFonts = array("fontttf"); var $TFontSize=array(); //字體大小范圍 var $TFontAngle=array(); //旋轉角度 var $Chars = ""; //驗證碼范圍(字母數字) var $Code = array(); //驗證碼 var $Image = ""; //圖形對象 var $FontColors=array(#f#bc#bd); //字體顏色紅綠藍 var $TPadden = ;///字符間距多少個字符 var $Txbase = ;///x軸兩邊距離 var $Tybase = ;///y軸兩邊距離 var $TLine =true; ///畫干擾線 public function RandRSI() ///生成驗證碼 { $this>TFontAngle=range($this>TFontAngle[]$this>TFontAngle[]); $this>TFontSize=range($this>TFontSize[]$this>TFontSize[]); $arr=array(); $Chars=$this>Chars; $TFontAngle=$this>TFontAngle; $TFontSize=$this>TFontSize; $FontColors=$this>FontColors; $code=""; $font=dirname(__FILE__)"/font/"$this>TFonts[]; $charlen=strlen($Chars); $anglelen=count($TFontAngle); // 角度范圍 $fontsizelen=count($TFontSize); // 角度范圍 $fontcolorlen=count($FontColors); // 角度范圍 for($i=;$i<$this>Length;$i++) ///得到字符與顏色 { $char=$Chars[rand($charlen)]; ///得到字符 $angle=$TFontAngle[rand($anglelen)]; ///旋轉角度 $fontsize=$TFontSize[rand($fontsizelen)]; ///字體大小 $fontcolor=$FontColors[rand($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[]; $height=$wh[]; ///高度 $this>Width=$width; $this>Height=$height; $this>Image = imageCreate( $width $height ); $image=$this>Image; $back = $this>_getColor($this>_getColor( $this>BgColor)); ///背景顏色 imageFilledRectangle($image $width $height $back); ///填充背景 $TPadden=$this>TPadden; $basex=$this>Txbase; $color=null; foreach ($codes as $v) ///逐個畫字符 { $bound=$v[]; $color=$this>_getColor($this>_getColor($v[])); imagettftext($image $v[] $v[] $basex $bound[height]$color $v[] $v[]); $basex=$basex+$bound[width]*$TPadden$bound[left];///計算下一個左邊距 } $this>TLine?$this>_wirteSinLine($color$basex):null; ///畫干擾線 header("Contenttype: 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[] $box[] $box[] $box[])); $max_x = max(array($box[] $box[] $box[] $box[])); $min_y = min(array($box[] $box[] $box[] $box[])); $max_y = max(array($box[] $box[] $box[] $box[])); return array( left => ($min_x >= ) ? abs($min_x + ) : abs($min_x + ) 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[]$color[])hexdec($color[]$color[])hexdec($color[]$color[])); } private function _getColor( $color ) //#ffffff { return imagecolorallocate ($this>Image $color[] $color[] $color[]); } private function _getImageWH($data) { $TPadden=$this>TPadden; $w=$this>Txbase; $h=; foreach ($data as $v) { $w=$w+$v[][width]*$TPadden$v[][left]; $h=$h>$v[][height]?$h:$v[][height]; } return array(max($w$this>Width)max($h$this>Height)); } //畫正弦干擾線 private function _wirteSinLine($color$w) { $img=$this>Image; $h=$this>Height; $h=rand(); $h=rand(); $w=rand(); $h=rand(); for($i=$w/;$i<$w/;$i=$i+) { $y=$h/$h*sin($i/$w)+$h/+$h; imagesetpixel($img$i+$w/$y$color); $h!=?imagesetpixel($img$i+$w/$y+$h$color):null; } } }

  

  外帶字體

  fontttf 一個簡單粗體文件

  image

  說明

  先看下運行效果吧大家也不要忙著復制運行了

  image image image image image ……

  主要特點是旋轉然後黏貼干擾線是線粗細可以變然後正弦波形可以變化

  比較復雜是calculateTextBox 這個函數這個是得到字符旋轉後的寬度高度

  demo:

  $rsi = new Utils_Caption(); $rsi>TFontSize=array(); $rsi>Width=; $rsi>Height=; $code = $rsi>RandRSI(); session_start(); $_SESSION["CHECKCODE"] = $code; $rsi>Draw();

  好了就寫這麼些了代碼還有很多不足之處歡迎朋友提出好的建議

 
From:http://tw.wingwit.com/Article/program/PHP/201311/21212.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.