PHP開発検証コード(検証コード生成)
前のセクションを通じて、畫像処理の本質(zhì)をよく理解しました。
私たちが持っている知識を通して。いくつかの簡単な拡張機能を使用すると、インターネット上で最も一般的に使用される小さなものの 1 つである検証コードを作成できます。
検証コードは、マシンが自動的に登録したり、マシンが自動的に投票をスワイプしたりするのを防ぐために最も一般的に使用される手段の 1 つです。
確認コードの効果を見てみましょう:
上記の効果に基づいて、実裝プロセスについて推論します。
実裝プロセス:
1. 指定した幅と高さのキャンバスを生成します
2. 生成する必要がある文字列を準備します
3. 実行するたびに、背景をランダムな色 (明るい色) で塗りつぶしますカラー) 4 .キャンバス上にランダムな干渉要素を描畫します (ランダムな點、ランダムな線、ランダムな円弧などは許容されますが、ユーザーの視覚に過度の影響を與えてはなりません)
5. 4 つの単語を書き込みます
6. ヘッダーを出力します, 特定のタイプに従って表示するようにブラウザーに指示します
7. 畫像を出力します
8. 畫像リソースを破棄します
上記の手順は、検証コードを?qū)g裝するすべての手順を明確に説明しています。このプロセスに基づいて推論して実裝してみましょう。
最初のステップはキャンバスを作成することです$img = imagecreate($width, $height);
カスタムの幅と高さを定義できます。関數(shù)を作成し、関數(shù)を通じて幅と高さを渡します。このようにして、キャプチャ畫像のサイズを変更できます。
function check_code($width = 100, $height = 50) { $img = imagecreate($width, $height); }2 番目のステップは、確認コードによって表示されるテキストを生成することです
確認コードのテキストには通常、數(shù)字と文字が含まれます。認証コードの文字を區(qū)別するため。 0-9A-Za-Z を使用できます。しかし、0 と o、l と I の區(qū)別が明確でない場合があります。処理する必要がない場合は、それを削除する方法を見つけることができます:
オプション 1:
4 つの ASCII コード、ASCII コード、および chr または sprintf ('%c'、2 番目のパラメーターが渡されます) をループします。 ASCII コード)は、指定された文字に変換される文字に対応します。for ($i = 0; $i < $num; $i++) { $rand = mt_rand(0, 2); switch ($rand) { case 0: $ascii = mt_rand(48, 57); //0-9 break; case 1: $ascii = mt_rand(65, 90); //A-Z break; case 2: $ascii = mt_rand(97, 122); //a-z break; } //chr() $string .= sprintf('%c', $ascii); }
オプション 2: この解決策は多くの人にとって少し複雑で、多くの人は ASCCI コードを理解できません。もっと簡単な解決策はありますか?一人でいる。文字を準備し、str_shuffle を使用して文字をシャッフルし、substr を使用して文字をインターセプトします。
//沒有0,i,l,o $str = 'abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789'; $str = str_shuffle($str); $string = substr($str,0 ,3);
3. 実行するたびに、背景をランダムな色(明るい色)で塗りつぶします 文字は暗くてはっきりと見えますが、背景は潛在色です。
背景のRG??Bカラー表現(xiàn)は通常次のようになります。RGBカラーは3つのカラー値であり、これらの3つのカラー値は0?255です。
そして:
0-120 低い値は暗い色です。130~255は通常明るい色です。
絵の色が使われているところがたくさんあります。したがって、色を割り當てる関數(shù)を定義できます:
//淺色的背景函數(shù) function randBg($img) { return imagecolorallocate($img, mt_rand(130, 255), mt_rand(130, 255), mt_rand(130, 255)); } //深色函數(shù),深色的字或者點這些干 擾元素 function randPix($img) { return imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120)); }
4. キャンバス上にランダムな干渉要素を描畫します
畫像內(nèi)にランダムに 50 ピクセルを描畫できます。最小の位置は 0,0 です。最大位置とは、最大幅または最大高さです。
次に、mt_rand(0、最大幅)、mt_rand(0、最大高さ)を使用します。次に、randPix を使用して、作成したキャンバスに色を割り當てます。
//畫干擾元素 for ($i = 0; $i < 50; $i++) { imagesetpixel($img, mt_rand(0, $width), mt_rand(0, $height), randPix($img)); }
5. 4 文字を書き込みます
$string は文字列、文字列 $string[0] は文字の最初の文字、などとなります。
つまり、imagechar 関數(shù)を使用して畫像にテキストを書き込むことができます。
數(shù)式を使用して、書かれたテキストの x 座標と y 座標を?qū)Г訾工长趣扦蓼埂?
X 位置 = 畫像の幅/文字數(shù) (4) * ループ數(shù)。 得られた結(jié)果は四捨五入され、各ループの実行回數(shù)が乗算されます。畫像の幅が 100 であると仮定すると、1 回目は 0、2 回目は 25、3 回目は 50、4 回目は 75 と書き込まれます。
Y 位置 = mt_rand(0,畫像高さ - 15)。
次のコードを推定し、対応するテキストを書くことができます:
for ($i = 0; $i < $num; $i++) { $x = floor($width / $num) * $i; $y = mt_rand(0, $height - 15); imagechar($img, 5, $x, $y, $string[$i], randPix($img)); }
6. ヘッダーを出力し、特定のタイプに従って表示するようにブラウザに指示します
畫像タイプ用の出力関數(shù)があることがわかっています。 imagejpeg、imagepng、imagegif およびその他の機能。
畫像の MIME タイプは、image/jpeg、image/png、image/gif などです。
したがって、変數(shù)を宣言できます:
$imagetype = 'jpeg';
$imagetype = 'gif';
$func = 'image' 。システムが複數(shù)のタイプをサポートしている場合は、次を使用します。 function_exists 検出関數(shù)は存在しますか。存在する場合、システムはこのタイプをサポートします。存在しない場合、システムはこのタイプをサポートしません。
$func = 'image' . $type; $header = 'Content-type:image/' . $type; if (function_exists($func)) { header($header); //變?yōu)榱薸magejpeg等 $func($img); } else { echo '圖片類型不支持'; }8. リソースを破棄し、文字を返す
今後検証するときは、全員が検証コードを表示する必要があります。さらに、ユーザーが入力した認証文字も畫像內(nèi)の認証文字と一致する必要があります。
そのため、後で保存して使用するために、検証文字を返す必要があります。imagedestroy($img); return $string;準備されたすべての PHP 関數(shù)ファイルを見てみましょう。誰でも學習して使用できるように、上記のコードを統(tǒng)合関數(shù)にカプセル化します。