PHP開発検証コード(検証コード生成)

前のセクションを通じて、画像処理の本質をよく理解しました。

私たちが持っている知識を通して。いくつかの簡単な拡張機能を使用すると、インターネット上で最も一般的に使用される小さなものの 1 つである検証コードを作成できます。

検証コードは、マシンが自動的に登録したり、マシンが自動的に投票をスワイプしたりするのを防ぐために最も一般的に使用される手段の 1 つです。

確認コードの効果を見てみましょう:

8.png

上記の効果に基づいて、実装プロセスについて推論します。

実装プロセス:

1. 指定した幅と高さのキャンバスを生成します

2. 生成する必要がある文字列を準備します

3. 実行するたびに、背景をランダムな色 (明るい色) で塗りつぶしますカラー) 4 .キャンバス上にランダムな干渉要素を描画します (ランダムな点、ランダムな線、ランダムな円弧などは許容されますが、ユーザーの視覚に過度の影響を与えてはなりません)

5. 4 つの単語を書き込みます

6. ヘッダーを出力します, 特定のタイプに従って表示するようにブラウザーに指示します

7. 画像を出力します

8. 画像リソースを破棄します

上記の手順は、検証コードを実装するすべての手順を明確に説明しています。このプロセスに基づいて推論して実装してみましょう。

最初のステップはキャンバスを作成することです

$img = imagecreate($width, $height);


カスタムの幅と高さを定義できます。関数を作成し、関数を通じて幅と高さを渡します。このようにして、キャプチャ画像のサイズを変更できます。

function check_code($width = 100, $height = 50) {
    $img = imagecreate($width, $height);
}

2 番目のステップは、確認コードによって表示されるテキストを生成することです

確認コードのテキストには通常、数字と文字が含まれます。認証コードの文字を区別するため。 0-9A-Za-Z を使用できます。しかし、0 と o、l と I の区別が明確でない場合があります。処理する必要がない場合は、それを削除する方法を見つけることができます:

オプション 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カラー表現は通常次のようになります。RGBカラーは3つのカラー値であり、これらの3つのカラー値は0〜255です。

そして:

0-120 低い値は暗い色です。

130~255は通常明るい色です。

絵の色が使われているところがたくさんあります。したがって、色を割り当てる関数を定義できます:

//浅色的背景函数
function randBg($img) {
    return imagecolorallocate($img, mt_rand(130, 255), mt_rand(130, 255), mt_rand(130, 255));
}
//深色函数,深色的字或者点这些干 扰元素
function randPix($img) {
    return imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
}

4. キャンバス上にランダムな干渉要素を描画します

画像内にランダムに 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 関数を使用して画像にテキストを書き込むことができます。

数式を使用して、書かれたテキストの x 座標と y 座標を導き出すことができます。

X 位置 = 画像の幅/文字数 (4) * ループ数。 得られた結果は四捨五入され、各ループの実行回数が乗算されます。画像の幅が 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. ヘッダーを出力し、特定のタイプに従って表示するようにブラウザに指示します

画像タイプ用の出力関数があることがわかっています。 imagejpeg、imagepng、imagegif およびその他の機能。

画像の MIME タイプは、image/jpeg、image/png、image/gif などです。

したがって、変数を宣言できます:

$imagetype = 'jpeg';
$imagetype = 'gif';

ヘッダータイプを出力するときに実行します:

$header = ' Content-type:image/' . $imagetype;

実行関数の出力は、変数関数に結合できます:

$func = 'image' 。システムが複数のタイプをサポートしている場合は、次を使用します。 function_exists 検出関数は存在しますか。存在する場合、システムはこのタイプをサポートします。存在しない場合、システムはこのタイプをサポートしません。

したがって、コードは次のように書くことができます:

   $func = 'image' . $type;
    $header = 'Content-type:image/' . $type;
    if (function_exists($func)) {
        header($header);
        //变为了imagejpeg等
        $func($img);
    } else {
        echo '图片类型不支持';
    }

8. リソースを破棄し、文字を返す

今後検証するときは、全員が検証コードを表示する必要があります。さらに、ユーザーが入力した認証文字も画像内の認証文字と一致する必要があります。

そのため、後で保存して使用するために、検証文字を返す必要があります。

   imagedestroy($img);
    return $string;

準備されたすべての PHP 関数ファイルを見てみましょう。誰でも学習して使用できるように、上記のコードを統合関数にカプセル化します。
学び続ける
||
<?php check_code(); function check_code($width = 100, $height = 50, $num = 4, $type = 'jpeg') { $img = imagecreate($width, $height); $string = ''; 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); } //背景颜色 imagefilledrectangle($img, 0, 0, $width, $height, randBg($img)); //画干扰元素 for ($i = 0; $i < 50; $i++) { imagesetpixel($img, mt_rand(0, $width), mt_rand(0, $height), randPix($img)); } //写字 for ($i = 0; $i < $num; $i++) { $x = floor($width / $num) * $i + 2; $y = mt_rand(0, $height - 15); imagechar($img, 5, $x, $y, $string[$i], randPix($img)); } //imagejpeg $func = 'image' . $type; $header = 'Content-type:image/' . $type; if (function_exists($func)) { header($header); $func($img); } else { echo '图片类型不支持'; } imagedestroy($img); return $string; } //浅色的背景 function randBg($img) { return imagecolorallocate($img, mt_rand(130, 255), mt_rand(130, 255), mt_rand(130, 255)); } //深色的字或者点这些干 扰元素 function randPix($img) { return imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120)); } ?>
  • おすすめコース
  • コースウェアのダウンロード
現時点ではコースウェアはダウンロードできません。現在スタッフが整理中です。今後もこのコースにもっと注目してください〜