Code de vérification du développement PHP (générer un code de vérification)
A travers la section précédente, nous avons bien saisi l'essence du traitement d'image.
Grâce aux connaissances dont nous disposons. Avec quelques extensions simples, nous pouvons écrire : l'une des petites choses les plus utilisées sur Internet - le code de vérification.
Le code de vérification est l'un des moyens les plus couramment utilisés pour empêcher les machines de s'enregistrer automatiquement et les machines de glisser automatiquement les tickets.
Jetons un coup d'œil à l'effet du code de vérification :
Nous raisonnerons sur le processus de mise en œuvre en fonction de l'effet ci-dessus.
Processus de mise en œuvre :
1. Générer un canevas avec une largeur et une hauteur spécifiées
2. Préparez la chaîne qui doit être générée
3. Chaque temps Exécutez et laissez l'arrière-plan être rempli de couleurs aléatoires (couleurs claires)
4. Dessinez des éléments d'interférence aléatoires sur la toile (des points aléatoires, des lignes aléatoires, des arcs aléatoires, etc. sont acceptables, mais ils ne doivent pas trop affecter le visuel de l'utilisateur)
5. Écrivez 4 mots
6. Sortez l'en-tête et dites au navigateur de l'afficher selon un certain type
7. Sortez l'image
8. Détruisez les ressources d'image
Les étapes ci-dessus expliquent clairement chaque étape de mise en œuvre du code de vérification. Ci-dessous, nous raisonnerons sur la mise en œuvre basée sur ce processus.
Première étape, créer une toile
$img = imagecreate($width, $height);
Nous pouvons définir une largeur et une hauteur personnalisées. Créez une fonction et passez en largeur et en hauteur à travers la fonction. De cette manière, la taille de l’image captcha peut être modifiée.
function check_code($width = 100, $height = 50) { $img = imagecreate($width, $height); }
La deuxième étape consiste à générer le texte affiché par le code de vérification
Le texte du code de vérification contient généralement des chiffres et des lettres. Afin de distinguer les caractères du code de vérification. Nous pouvons utiliser 0-9A-Za-Z. Mais parfois, la distinction entre 0 et o, l et I n'est pas claire. Si nous n'avons pas besoin de le traiter, nous pouvons trouver un moyen de le supprimer :
Solution 1 :
Parcourez 4 codes ascii, et le code ascii, et chr ou sprintf('%c' , le deuxième paramètre est transmis en code ascii) pour convertir les caractères correspondants en caractères spécifiés.
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); }
Option 2 :
La première option est un peu compliquée pour beaucoup de gens, et beaucoup de gens ne peuvent pas comprendre le code ascci. Existe-t-il une solution plus simple ? Seul il y en a. Je peux préparer les caractères, puis utiliser str_shuffle pour mélanger les caractères, puis utiliser substr pour les intercepter.
//没有0,i,l,o $str = 'abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789'; $str = str_shuffle($str); $string = substr($str,0 ,3);
3. Chaque fois qu'il est exécuté, laissez le fond être rempli d'une couleur aléatoire (couleur claire)
Le texte est sombre. et peut être vu clairement, alors que l'arrière-plan est latent.
La représentation des couleurs RVB de l'arrière-plan est généralement la suivante. La couleur RVB est composée de trois valeurs de couleur, et ces trois valeurs de couleur vont de 0 à 255.
Et :
0-120 Les valeurs faibles sont des couleurs sombres.
130 - 255 couleurs généralement claires.
Il existe de nombreux endroits où les couleurs des images sont utilisées. Par conséquent, je peux définir la fonction d'attribution des couleurs :
//浅色的背景函数 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. Dessiner des éléments d'interférence aléatoires sur la toile
On peut tirer au hasard 50 pixels dans l'image. La plus petite position est 0,0. La position la plus grande correspond à la plus grande largeur ou à la plus grande hauteur.
Ensuite, utilisez mt_rand(0, largeur maximale), mt_rand(0, hauteur maximale). Utilisez ensuite randPix pour attribuer des couleurs au canevas que nous avons créé.
//画干扰元素 for ($i = 0; $i < 50; $i++) { imagesetpixel($img, mt_rand(0, $width), mt_rand(0, $height), randPix($img)); }
5. Écrivez 4 mots
$string est une chaîne, et la chaîne $string[0] est le premier caractère du caractère un caractère, et ainsi de suite.
Ainsi, je peux utiliser la fonction imagechar pour écrire du texte dans l'image.
Nous pouvons utiliser une formule pour dériver les coordonnées x et y du texte écrit.
Position X = largeur de l'image/nombre de caractères (4) * nombre de boucles. Le résultat obtenu est arrondi et multiplié par le nombre de fois que chaque boucle est effectuée. Supposons que l'image fasse 100 largeurs, alors : la première fois est écrite à 0, la deuxième fois est 25, la troisième fois est 50 et la quatrième fois est 75.
Position Y = mt_rand(0,hauteur de l'image - 15).
On peut déduire le code suivant et écrire le texte correspondant :
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. Sortez l'en-tête et dites au navigateur de l'afficher selon un certain type
Nous savons que les fonctions de sortie des types d'images ont les caractéristiques suivantes : imagejpeg, imagepng, imagegif et d'autres caractéristiques.
Le type MIME de l'image est image/jpeg, image/png, image/gif, etc.
On peut donc déclarer une variable :
$imagetype = 'jpeg';
$imagetype = 'png';
$imagetype = 'gif';
Exécuter lors de la sortie du type d'en-tête :
$header = 'Content-type:image/' . $imagetype;
La sortie de la fonction d'exécution peut être fusionnée en un. fonction variable :
$func = 'image' . $type;
Si notre système prend en charge un type, utilisez function_exists pour détecter si la fonction existe. S'il existe, le système prend en charge ce type ; s'il n'existe pas, il ne prend pas en charge ce type.
Le code peut donc s'écrire ainsi :
$func = 'image' . $type; $header = 'Content-type:image/' . $type; if (function_exists($func)) { header($header); //变为了imagejpeg等 $func($img); } else { echo '图片类型不支持'; }
8. Détruisez la ressource et renvoyez les caractères
pendant vérification plus tard. Tout le monde doit afficher le code de vérification. De plus, les caractères de vérification saisis par l'utilisateur doivent également correspondre aux caractères de vérification de l'image.
Les caractères de vérification doivent donc être renvoyés pour être enregistrés et utilisés ultérieurement.
imagedestroy($img); return $string;
Jetons un coup d'œil à tous les fichiers de fonctions PHP préparés. Nous allons encapsuler le code ci-dessus dans une fonction unifiée que tout le monde pourra apprendre et utiliser :
<?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)); } ?>