Maison  >  Article  >  développement back-end  >  Comment implémenter le code de vérification d'image en php

Comment implémenter le code de vérification d'image en php

藏色散人
藏色散人original
2021-09-26 11:34:324539parcourir

Comment implémenter le code de vérification d'image en PHP : 1. Chargez l'extension GD ; 2. Créez un canevas et ajoutez du contenu au canevas ; 3. Enregistrez la sortie via imagepng ; 5. Générez des données de code de vérification aléatoires ; .

Comment implémenter le code de vérification d'image en php

L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.1, ordinateur DELL G3.

Comment implémenter le code de vérification d'image en php ?

PHP implémente la fonction de code de vérification d'image

Code de vérification : captcha, est une technologie utilisée pour distinguer les personnes des ordinateurs
Principe (Test de Turing public entièrement automatisé pour distinguer les ordinateurs et les humains (Test de Turing public entièrement automatisé pour distinguer Ordinateurs et humains à part) Test de Turing)

Comment distinguer les ordinateurs des humains ?
Tant qu'il s'agit de contenu textuel, les ordinateurs peuvent certainement le reconnaître ; les ordinateurs ne peuvent pas reconnaître le contenu des images, mais l'œil humain peut facilement reconnaître le contenu dans images.

L'essence du code de vérification : Imprimez du contenu textuel sur les images pour réaliser la différence entre les ordinateurs et les humains.

1. Comprendre les extensions d'image

PHP lui-même ne peut pas utiliser les images.

Images Il existe de nombreuses extensions : celle couramment utilisée est GD

Chargement de l'extension GD : Toutes les fonctions de l'extension GD commencent par image

2. Opération PHP images

1. )

ressource image imagecreatetruecolor( Largeur, hauteur);

2. Ajouter du contenu (texte) au canevas

a) Attribuez une couleur au contenu à ajouter à l'image : Associez d'abord la couleur à la ressource image, et ensuite vous pouvez utiliser le

color handle [integer] ] imagecolorallocate(picture resources, red, green, blue); //La couleur peut utiliser des nombres 0-255 ou utiliser l'hexadécimal #hexadecimal

b) pour écrire du texte : uniquement en anglais. (table de codes ASCII))

Chaîne d'image booléenne (ressource d'image, taille du texte, coordonnée X de départ, coordonnée Y de départ, contenu d'écriture, couleur);
Taille de police : 1-5

3. Enregistrez la sortie

imagepng(image. ressource[, Enregistrer l'emplacement]);

4. Libérer les ressources (version de ressource recommandée)

Résultat booléen imagedestroy (ressource d'image);

//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. Image du code de vérification

1. Générer des données de code de vérification aléatoires

2. Créer un canevas

3. Remplir la couleur d'arrière-plan : imagefill (ressource d'image, position de départ X, position de départ Y, poignée de couleur) ; //imagefill : Après avoir trouvé un pixel, s'il s'avère que les pixels environnants ont la même couleur que le le pixel actuel (tout noir) sera automatiquement rendu.

4. Ajoutez du contenu textuel : attribuez d'abord la couleur

5 Enregistrez la sortie : le code de vérification est affiché

6. Libérez les ressources

//制作验证码图片

//获取验证码字符串
$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.

Deux points à noter

Obtenez un chinois aléatoire : en PHP, les données sont exploitées en octets. Le chinois a différents nombres d'octets dans différents jeux de caractères

Fonction d'écriture chinoise : imagettftext (ressource d'image, taille de police, angle de rotation de la police, démarrage de la police) Images de sortie

5. Détruire les ressources

//中文验证码
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. Classe de code de vérification d'encapsulation

//验证码工具类

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;]));
    }

}

Apprentissage recommandé : "

Tutoriel vidéo PHP

"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn