ホームページ  >  記事  >  バックエンド開発  >  PHPで画像検証コードを実装する方法

PHPで画像検証コードを実装する方法

藏色散人
藏色散人オリジナル
2021-09-26 11:34:324475ブラウズ

PHP で画像検証コードを実装する方法: 1. GD 拡張機能をロードする; 2. キャンバスを作成し、コンテンツをキャンバスに追加する; 3. imagepng を通じて出力を保存する; 4. リソースを解放する; 5. 生成するランダム認証コードデータ 以上です。

PHPで画像検証コードを実装する方法

この記事の動作環境: Windows 7 システム、PHP バージョン 7.1、DELL G3 コンピューター。

PHP で画像検証コードを実装するにはどうすればよいですか?

PHP が画像認証コード機能を実現

認証コード:キャプチャは、人とコンピュータを区別するために使用される技術です
原則 (完全自動公開)コンピュータと人間を区別するためのチューリング テスト (コンピュータと人間を区別するための全自動チューリング テスト)

コンピュータと人間を区別する方法?
テキスト コンテンツである限り、コンピュータはそれを確実に認識できます。コンピュータは画像の内容を認識することはできませんが、人間の目は画像の内容を簡単に識別できます。

検証コードの本質: コンピュータとコンピュータの違いを認識するために、画像上にテキストの内容を印刷することです。 human.

1. 画像拡張機能について理解する

PHP 自体は画像を操作できません。
PHP は提供されている画像拡張機能を使用して画像を操作できます。

画像拡張機能は数多くあります。 : 一般的に使用されるのは GD

GD 拡張機能のロード: すべての GD 拡張機能は image

2 で始まります。 PHP 操作画像

1. キャンバスの追加 (キャンバスの作成)

画像リソース imagecreatetruecolor(width, height);

2. キャンバスにコンテンツ (テキスト) を追加

a) 画像に追加されたコンテンツに色を割り当てます。最初に色を画像リソースに関連付けてから、
カラー ハンドル [整数] imagecolorallocate(画像リソース、赤、緑、青) を使用します。 ); //色には 0 ~ 255 の数字を使用するか、16 進数#Hex

b) を使用してテキストを書くことができます: 英語のみを書くことができます (ASCII コード テーブルの内容)
Boolean imagestring(image resource,テキスト サイズ、開始 X 座標、開始 Y 座標、書き込み内容、色);
フォント サイズ: 1-5

3. 出力を保存します

imagepng(画像リソース[,保存location]);

4. リソースのリリース (リソースの推奨リリース)

ブール結果 imagedestroy (画像リソース);

//1.    创建画布
$img = imagecreatetruecolor(200,200);
//var_dump($img);

//2.    作画
//2.1   给画布分配颜色
$color = imagecolorallocate($img,255,255,255);
//echo $color;

//2.2   写入文字
$true = imagestring($img,5,50,90,'hello world',$color);
//var_dump($true);

//3.    保存输出内容
//3.1   输出
//告诉浏览器,内容是图片
//header('Content-type:image/png');
//imagepng($img);

//3.2   保存图片
imagepng($img,'hello.png'); // 保存到当前目录

//4.    释放资源
$res = imagedestroy($img);
var_dump($res);

3. 検証コード画像

1. ランダムな検証コードデータを生成

##2. キャンバスを作成

##3. 背景色を塗りつぶす: imagefill(画像リソース, 開始位置 X, 開始位置 Y, カラーハンドル); // imagefill: ピクセルを選択した後、周囲の隣接するピクセルが現在のピクセルと同じ色 (すべて黒) であることが判明した場合、それらは自動的にレンダリングされます。

4. テキスト コンテンツを追加します。最初に色を割り当てます

5。出力を保存します: 検証コードはすべて出力されます

6。リソースを解放します

//制作验证码图片

//获取验证码字符串
$captcha = '';
for($i = 0;$i < 4;$i++){
    //chr: 将数字转换成对应的字符(ASCII)
    switch(mt_rand(0,2)){
        case 0: //数字
            $captcha .= chr(mt_rand(49,57));
            break;
        case 1:    //大写字母
            $captcha .= chr(mt_rand(65,90));
            break;
        case 2: //小写字母
            $captcha .= chr(mt_rand(97,122));
            break;
    }
}
//echo $captcha;

//创建画布
$img = imagecreatetruecolor(200,200);

//给背景分配颜色
$bg = imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));

//填充背景色
imagefill($img,0,0,$bg);

//循环写入
for($i = 0;$i < 4;$i++){
    //分配文字颜色
    $txt = imagecolorallocate($img,mt_rand(50,150),mt_rand(50,150),mt_rand(50,150));

    //写入文字
    imagestring($img,mt_rand(1,5),60 + $i*20,90,$captcha[$i],$txt);
}

//输出
header(&#39;Content-type:image/png&#39;);
imagepng($img);

//释放资源
imagedestroy($img);

4。中国語の検証コード

Two注意点

ランダムな中国語の取得: PHPの場合中国語ではデータはバイト単位で操作されます。中国語は文字セットごとにバイト数が異なります。

中国語書き込み関数: imagettftext(画像リソース、フォントサイズ、フォント回転角度、フォント開始 X、フォント開始 Y、フォント ファイル、コンテンツ、色);

1. キャンバスの作成: 背景色を塗りつぶします

#2. ランダムな中国語を取得

3.画像に中国語を書き込みます

4. 出力画像を保存します

5. リソースを破棄します

//中文验证码
header(&#39;Content-type:text/html;charset=utf-8&#39;);

//创建画布
$img = imagecreatetruecolor(200,200);
//给背景分配颜色
$bg = imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
//填充背景色
imagefill($img,0,0,$bg);

//写入内容
for($i = 0;$i < 4;$i++){
    //分配颜色
    $txt = imagecolorallocate($img,mt_rand(50,150),mt_rand(50,150),mt_rand(50,150));

    //获取随机中文
    $string = "今天我寒夜里看雪飘过怀着冷却了的心窝飘远方";
    
    $pos = mt_rand(0,strlen($string) - 1);
    $start = $pos - $pos % 3;        //utf-8取模3,GBK取模2

    //取三个长度(字符串截取)
    $target = substr($string,$start,3);

    //写入中文
    imagettftext($img,mt_rand(20,40),mt_rand(-45,45),40 + $i * 30, mt_rand(80,120),$txt,&#39;simple.ttf&#39;,$target);

}

//输出图片
header(&#39;Content-type:image/png&#39;);
imagepng($img);

//销毁资源
imagedestroy($img);

5. カプセル化検証コードクラス

//验证码工具类

class Captcha{
    //属性
    private $width;
    private $height;
    private $strlen;
    private $lines;     //干扰线数量
    private $stars;     //干扰点数量
    private $font;      //字体路径

    //构造方法:初始化属性
    public function __construct($info = array()){
        //初始化属性
        $this->width    = isset($info[&#39;width&#39;])?$info[&#39;width&#39;]:146;
        $this->height    = isset($info[&#39;height&#39;])?$info[&#39;height&#39;]:23;
        $this->strlen    = isset($info[&#39;strlen&#39;])?$info[&#39;strlen&#39;]:4;
        $this->lines    = isset($info[&#39;lines&#39;])?$info[&#39;lines&#39;]:10;
        $this->stars    = isset($info[&#39;stars&#39;])?$info[&#39;stars&#39;]:50;
        $this->font        = isset($info[&#39;font&#39;])?$info[&#39;font&#39;]:&#39;fonts/AxureHandwriting-BoldItalic.otf&#39;;
    }

    //生成验证码图片
    public function generate(){
        //创建画布,给定背景色
        $img = imagecreatetruecolor($this->width,$this->height);
        $c_bg = imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
        imagefill($img,0,0,$c_bg);

        //写入字符串
        $captcha = $this->getStr();
        
        //增加干扰点"*"
        for($i = 0;$i < $this->stars;$i++){
            //随机颜色
            $c_star = imagecolorallocate($img,mt_rand(100,150),mt_rand(100,150),mt_rand(100,150));

            //写入*号
            imagestring($img,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),&#39;*&#39;,$c_star);
        }

        //增加干扰线
        for($i = 0;$i < $this->lines;$i++){
            //随机颜色
            $c_line = imagecolorallocate($img,mt_rand(150,200),mt_rand(150,200),mt_rand(150,200));

            //划线
            imageline($img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$c_line);
        }

        //随机颜色
        for($i = 0;$i < $this->strlen;$i++){
            $c_str = imagecolorallocate($img,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));
            imagettftext($img,mt_rand(10,20),mt_rand(-45,45),20 + $i * 30,mt_rand(14,$this->height - 6),$c_str,$this->font,$captcha[$i]);

        }
        
        //输出图片
        header(&#39;Content-type:image/png&#39;);
        imagepng($img);

        //释放资源
        imagedestroy($img);
    }

    //获取随机字符串
    //@return 字符串
    private function getStr(){
        //ASCII码表生成字符串
        $str = &#39;&#39;;

        //循环生成
        for($i = 0;$i < $this->strlen;$i++){
            //随机选择数字,小写字母和大写字母
            switch(mt_rand(0,2)){
                case 0: //数字
                    $str .= chr(mt_rand(49,57));
                    break;
                case 1: //小写字母
                    $str .= chr(mt_rand(97,122));
                    break;
                case 2: //大写字母
                    $str .= chr(mt_rand(65,90));
                    break;
            }
        }

        //将验证码字符串保存到session
        $_SESSION[&#39;captcha&#39;] = $str;

        //返回结果
        return $str;
    }

    /*
     * 验证验证码
     * @param1 string $captcha,用户输入的验证码数据
     * @return boolean,成功返回true,失败返回false
     */
    public static function checkCaptcha($captcha){
        //与session中的验证码进行验证

        //验证码不区分大小写
        return (strtoupper($captcha) === strtoupper($_SESSION[&#39;captcha&#39;]));
    }

}

推奨される学習: 「

PHP ビデオ チュートリアル

>>

以上がPHPで画像検証コードを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。