検証コードは開発時によく使う機能なので、PHPクラスのプラグインとして使用する検証コードクラスをパッケージ化しましたので、読者の皆様にも共有したいと思います。
実装原理も非常にシンプルで、キャンバスのいくつかの機能と、いくつかの文字列の取得を使って、それを組み合わせるだけです(笑)。
ここで私の考えを簡単に書かせてください。実際、このクラスは非常に明確にコメントされていますが、書く前にまだ長文にしたいと思います。
最初はいくつかの機能の説明です。ここでの説明は完全に個人的な経験です。間違いがあれば修正してください。
1. キャンバス関数の作成: imagecreatetruecolor(w,h);
説明: キャンバスを作成するために使用されます。
w キャンバスの幅
h キャンバスの高さ
この関数の戻り値 リソースクラス(gd)
2. キャンバスの色を作成します: imagecolorallocate(img,red,green,blue) )
説明:
img Canvas resource
red,green,blue 0~255の範囲です
3.キャンバスに背景色を追加します
imagefill(img,x,y,color);
説明:
image 画像の座標x,y (画像の左上隅が0,0)
4.枠線を描く
Imagerectangle($img,x1,y1,x2, y2,color);
説明:
その左上隅の座標はx1,y1、右下隅の座標はx2,y2です。画像の左上隅の座標は 0, 0 です。
3.描画内容(文字)
Imagestring(img, size, x, y, string, color); が起点です
文字列は描画する内容です
Colorは色です
4. ブラウザに画像形式を伝えますHeader("Content-type: image/png") は image/gif などです
5. 出力 (または保存)、2 番目のパラメータも使用できます保存するにはImagepng(img【,filename】)
Imagejpeg(img【,filename】)
Imagegif(img【,filename】)
6. 本質的には直線である干渉線を追加しますimageline(img,x1,y1,x2,y2,color);
Img Canvas
x1,y1始点 x2,y2終点
カラーcolor
7.imagettftext(サイズ、角度, x, y, color, fontfile, text )Description:
img Canvas
size フォントサイズ、デフォルト 単位ピクセル
角度 angle 🎈 以下はアイデアです:
最初にキャンバスが生成されます、次に、文字列、直線、ノイズ ポイント、および境界線がキャンバスに追加され、検証コードが生成されます。クラスによって返される最後の 2 つのパブリック インターフェイスは、検証コードを生成するためのキャンバスと、外部から呼び出すことができる検証コードです。文字列合成の目的は、検証コードキャンバスを外部に出力し、検証用の文字列を保存することです。コードは次のとおりです:
<?php namespace captcha; /* *验证码类 *verify方法生成验证码字符串 *entry方法生成验证码 *特别提醒:这里要先用entry生成验证码,再用verify生成验证码的字符串,也就是必须先调用entry,然后才能够调用verify生成验证码的字符串,原因代码已经说明问题了,因为验证码的字符串是在entry方法调用captchaImage生成的,所以必须先调用它才行 *有的地方对中文的字体要求比较高,所以,有的地方不支持中文验证码 */ class Captcha{ //配置参数 private $config = array(); //验证码 private $verifyCode = ''; //获取配置文件的配置信息,给类传参数就行,例如new Captcha($config);$config是你的配置文件信息 public function __construct($config=array('width'=>100,'height'=>40,'length'=>4,'size'=>7,'lines'=>0,'dots'=>0,'font'=>'simfang.ttf','rectangle'=>array(255,55,122),'charset'=>true,'chinese'=>'来到新机场主航站楼建设在婚姻关系存续期间所负债务她在收到要求她偿还前夫在婚姻关系存续期间所欠债务的法院传票后要精益求精善始善终')){ $this->config = $config; } //创建验证码 private function captchaImage(){ //画布 $img = imagecreatetruecolor($this->config['width'],$this->config['height']); //填充画布颜色 imagefill($img,0,0,imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255))); //需要边框则画边框 if($this->config['rectangle'] && is_array($this->config['rectangle']) && count($this->config['rectangle']) == 3){ $this->tangle($img); } $this->verifyCode = $this->code($img,$this->config['charset'],$this->config['chinese']); //存在则添加干扰线 if($this->config['lines']){ $this->codeLines($img); } //存在则添加干扰点 if($this->config['dots']){ $this->codeDots($img); } return $img; } private function codeLines($img){ //绘制干扰线 for($i=0;$i<$this->config['lines'];$i++){ imageline($img,mt_rand(0,$this->config['width'] / 10),mt_rand(0,$this->config['height']),mt_rand($this->config['width'] * 7/ 10,$this->config['width'] * 9/ 10),mt_rand(0,$this->config['height']),imagecolorallocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255))); } } private function codeDots($img){ //添加噪点 for($i=0;$i<$this->config['dots'];$i++){ //噪点颜色 $color = imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)); imagestring($img,mt_rand(1,3),mt_rand(0,170),mt_rand(0,30),'*',$color); } } /*画布边框*/ private function tangle($img){ imagerectangle($img,0,0,$this->config['width']-1,$this->config['height']-1,imagecolorallocate($img,$this->config['rectangle'][0],$this->config['rectangle'][1],$this->config['rectangle'][2])); } /*生成验证码,默认英文,$ch为true则为中文*/ private function code($img,$ch=false,$set=''){ $str = ""; //计算间隔 $span = ceil($this->config['width']/($this->config['length']+1)); if($ch && !empty($set)){ //随机产生字符 $set = $this->config['chinese']; for($i=0;$i<$this->config['length'];$i++){ $end = strlen($set)/3; $pos = mt_rand(0,$end-1); $str .= substr($set,$pos*3,3); } //每次绘制一个字符 for($i=1;$i<=$this->config['length'];$i++){ imagettftext($img,16,mt_rand(-30,60),$i*$span,$this->config['height']*3/5,imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)),$this->config['font'],substr($str,($i-1)*3,3)); } }else{ //随机生成字母或者数字 for($i=0;$i<$this->config['length'];$i++){ switch(mt_rand(0,2)){ case 0: $str .= chr(mt_rand(65,90)); break; case 1: $str .= chr(mt_rand(97,122)); break; case 2: $str .= chr(mt_rand(48,57)); } } //每次绘制一个字符 for($i=1;$i<=$this->config['length'];$i++){ imagestring($img,$this->config['size'],$i*$span,0,$str[$i-1],imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180))); } } return $str; } //获取验证码 public function verify(){ return $this->verifyCode; } //生成验证码 public function entry(){ header("content-type:image/png"); imagepng($this->captchaImage()); } } $ob = new Captcha; $ob->entry();
最後に、他の人を誤解させないようにさせてください。もう一度強調してください:
ここでは、まずentryを使用して検証コードを生成し、次にverifyを使用して検証コード文字列を生成する必要があります。つまり、最初にentryを呼び出す必要があり、その後verifyを呼び出して検証コード文字列を生成できます。理由コードはすでに問題を説明しています。検証コードの文字列はエントリ メソッドの captchaImage メソッドで生成されるため、最初に呼び出す必要があります。一部の場所では中国語フォントの要件が高く、一部の場所ではそうではありません。中国語の検証コードをサポートその他の PHP カプセル化検証コード クラス 関連記事については、PHP 中国語 Web サイトに注目してください。