長い間記事を書いていませんでした。新しいプロジェクトで常に忙しい。 最近、認証コードのプログラムを作るときに、シンプルでエレガントなものにしたいと常々思っているのですが、それを自動的に識別するのは難しいです。 これらのコレクションを通じて、一般的な方法には次の解決策があることがわかりました:
1. フォントのバリエーション (通常はアルゴリズムによって歪められます。より代表的なものは次のとおりです: http://code.google.com/p/cool-php -captcha) /
2. フォントの貼り付け (QQ 検証コードがここに表示されています。オンラインで見つけることや QQ 検証コードを解読する方法はまだ困難です)
3. 干渉線とノイズポイント (この種の識別は非常に簡単で、プログラムによって自動的に識別できます)
上で述べたように、1 番目と 2 番目の方法は識別するのがより困難です。個人的には、あまり手間がかからないようなので、2 番目の方法を好みます。そして、ねじれたテキストは常に奇妙に感じられます。 ハハ、完全に個人的な好みです。
実装コード:
コードをコピー コードは次のとおりです:
/**
*テキストの回転、傾き、貼り付け、正弦干渉線検証コードの追加あり*
*@version 0.1
*@author http://www.cnblogs.com/chengmo
*@copyright Cheng Mo QQ:8292669
*/
class Utils_Caption
{
var $Width = 60; / /認証コードの数字
var $BgColor = "#FFFFFF" //背景色
var $TFonts; = array("font.ttf");
var $TFontSize=array(17,20); //フォントサイズの範囲
var $TFontAngle=array(-20,20); // 回転角度
var $Chars = " 0123456789"; //検証コード範囲(英数字)
var $Code = array(); $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);角度範囲
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;
$this->高さ=$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) ) ///文字を1文字ずつ描画します
{
$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 write文字
* @return 配列 長さ、幅、高さを返します
*/
プライベート関数 _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
);
}
プライベート関数 _getColor( $color ) //#ffffff
{
return array(hexdec($color[1].$) color[2]),hexdec($color[3].$color[4]),hexdec($color[5].$color[6]));
}
プライベート関数 _getColor2( $color ) //# ffffff
{
return imagecolorallocate ($this->Image, $color[0], $color[1], $color[2]);
}
プライベート関数 _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->画像;
$h=$this->高さ;
$h1=rand(-5,5);
$h2=rand(-1,1);
$ w2=rand(10,15);
$h3=rand(4,6);
for($i=-$w/2;$i {
$y=$h/$h3*sin($i/$w2)+$h/2+$h1;
imagesetpixel($img,$i+$w/2,$y,$color);
$h2 !=0?imagesetpixel($img,$i+$w/2,$y+$h2,$color):null;
}
}
}
外带字体:
font.ttf ,一个简单粗
説明:先見下行効果、大家も不要な忙しいを実行します。
の主な特徴は次のとおりです: 回転、その後、干線は線の粗さを変化させることができ、その後、正弦波形を変化させることができます。符回転後の振幅高さ。
デモ:
复制代码
代码如下:$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( );
いいですね、これを書きます、代コードもかなり不足しています。
http://www.bkjia.com/PHPjc/327913.html
www.bkjia.comtrue
http://www.bkjia.com/PHPjc/327913.html技術記事最近、コードプログラムを検討中ですが、常に慎重に検討しており、自動認識は非常に困難です。