對於上面提到
實現代碼
<?php /** *帶文字旋轉
傾斜 黏貼 加正弦干擾線驗證碼* *@version *@author *@copyright 程默 QQ: */ class Utils_Caption { var $Width = ; //圖片寬 var $Height = ; //圖片高 var $Length = ; //驗證碼位數 var $BgColor = "#FFFFFF"; //背景色 var $TFonts = array("font ttf"); 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("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[ ] $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; } } }
外帶字體
font
ttf 一個簡單粗體文件
說明
先看下運行效果吧
大家也不要忙著復制運行了 ……
主要特點是
旋轉 然後黏貼 干擾線是線粗細可以變 然後正弦波形可以變化 比較復雜是
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