Melalui bahagian sebelumnya, kami telah memahami dengan baik intipati pemprosesan imej.
Melalui ilmu yang kita ada. Dengan beberapa sambungan mudah, kami boleh menulis: salah satu perkara kecil yang paling biasa digunakan di Internet - kod pengesahan.
Kod pengesahan ialah salah satu cara yang paling biasa digunakan untuk menghalang mesin daripada mendaftar secara automatik dan mesin meleret tiket secara automatik.
Mari kita lihat kesan kod pengesahan:
Kami akan membuat alasan tentang proses pelaksanaan berdasarkan kesan di atas.
Proses pelaksanaan:
1. Hasilkan kanvas dengan lebar dan ketinggian yang ditetapkan
2. Sediakan rentetan yang perlu dijana
3. Setiap masa Laksanakan dan biarkan latar belakang diisi dengan warna rawak (warna terang)
4. Lukis elemen gangguan rawak pada kanvas (titik rawak, garis rawak, arka rawak, dsb. boleh diterima, tetapi ia tidak boleh terlalu berlebihan. mempengaruhi Visual pengguna)
5. Tulis 4 perkataan
6. Keluarkan pengepala dan beritahu pelayar untuk memaparkannya mengikut jenis tertentu
7. Keluarkan imej
8. Musnahkan sumber imej
Langkah di atas menerangkan dengan jelas setiap langkah melaksanakan kod pengesahan. Di bawah ini kami akan membuat alasan tentang pelaksanaan berdasarkan proses ini.
Langkah pertama, buat kanvas
$img = imagecreate($width, $height);
Kami boleh menentukan lebar dan ketinggian tersuai . Buat fungsi dan hantarkan lebar dan tinggi melalui fungsi tersebut. Dengan cara ini, saiz imej captcha boleh diubah suai.
function check_code($width = 100, $height = 50) { $img = imagecreate($width, $height); }
Langkah kedua ialah menjana teks yang dipaparkan oleh kod pengesahan
Teks kod pengesahan biasanya mengandungi nombor dan huruf. Untuk membezakan aksara kod pengesahan. Kita boleh menggunakan 0-9A-Za-Z. Tetapi kadangkala perbezaan antara 0 dan o, l dan I tidak jelas. Jika kami tidak perlu memprosesnya, kami boleh mencari cara untuk mengalih keluarnya:
Penyelesaian 1:
Gelung melalui 4 kod ascii, dan kod ascii, dan chr atau sprintf('%c' , parameter kedua diluluskan kod ascii) untuk menukar aksara yang sepadan kepada aksara yang ditentukan.
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); }
Pilihan 2:
Pilihan satu agak rumit untuk ramai orang dan ramai orang tidak dapat memahami kod ascci. Adakah terdapat penyelesaian yang lebih mudah? Sendiri ada. Saya boleh menyediakan aksara, kemudian menggunakan str_shuffle untuk mengocok aksara dan kemudian menggunakan substr untuk memintas mereka.
//没有0,i,l,o $str = 'abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789'; $str = str_shuffle($str); $string = substr($str,0 ,3);
3. Setiap kali ia dilaksanakan, biarkan latar belakang diisi dengan warna rawak (warna terang)
Teksnya gelap dan boleh dilihat dengan jelas, manakala latar belakangnya terpendam.
Perwakilan warna RGB pada latar belakang biasanya seperti ini Warna RGB ialah tiga nilai warna, dan tiga nilai warna ini adalah dari 0-255.
Dan:
0-120 Nilai rendah adalah warna gelap.
130 - 255 biasanya warna terang.
Terdapat banyak tempat di mana warna gambar digunakan. Oleh itu, saya boleh mentakrifkan fungsi memberikan warna:
//浅色的背景函数 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. Lukis unsur gangguan rawak pada kanvas
Kami boleh melukis 50 piksel secara rawak dalam gambar. Kedudukan terkecil ialah 0,0. Kedudukan terbesar ialah lebar terbesar atau ketinggian terbesar.
Kemudian gunakan mt_rand(0, lebar maksimum), mt_rand(0, ketinggian maksimum). Kemudian gunakan randPix untuk menetapkan warna pada kanvas yang kami buat.
//画干扰元素 for ($i = 0; $i < 50; $i++) { imagesetpixel($img, mt_rand(0, $width), mt_rand(0, $height), randPix($img)); }
5 Tulis 4 perkataan
$string ialah rentetan dan rentetan $string[0] ialah aksara pertama bagi watak satu watak, dan seterusnya.
Jadi, saya boleh menggunakan fungsi imagechar untuk menulis teks dalam imej.
Kita boleh menggunakan formula untuk memperoleh koordinat x dan y teks bertulis.
Kedudukan X = lebar imej/bilangan aksara (4) * bilangan gelung. Hasil yang diperoleh dibulatkan dan didarab dengan bilangan kali setiap gelung dilakukan. Andaikan imej itu ialah 100 lebar, maka: kali pertama ditulis pada 0, kali kedua ialah 25, kali ketiga ialah 50, dan kali keempat ialah 75.
Kedudukan Y = mt_rand(0,tinggi imej - 15).
Kita boleh menyimpulkan kod berikut dan menulis teks yang sepadan:
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. Keluarkan pengepala dan beritahu pelayar untuk memaparkannya mengikut jenis tertentu
Kita tahu bahawa fungsi output jenis imej mempunyai ciri-ciri berikut: imagejpeg, imagepng, imagegif dan ciri-ciri lain.
Jenis mime bagi imej ialah imej/jpeg, imej/png, imej/gif, dsb.
Oleh itu, kita boleh mengisytiharkan pembolehubah:
$imagetype = 'jpeg';
$imagetype = 'png';
$imagetype = 'gif';
Laksanakan apabila mengeluarkan jenis pengepala:
$header = 'Content-type:image/' . fungsi pembolehubah:
$func = 'imej' $type;
Jika sistem kami menyokong jenis, gunakan function_exists untuk mengesan sama ada fungsi itu wujud. Jika ia wujud, sistem menyokong jenis ini; jika ia tidak wujud, ia tidak menyokong jenis ini.
Jadi kod boleh ditulis seperti ini:
$func = 'image' . $type; $header = 'Content-type:image/' . $type; if (function_exists($func)) { header($header); //变为了imagejpeg等 $func($img); } else { echo '图片类型不支持'; }
8. Musnahkan sumber dan kembalikan aksara semasa pengesahan kemudian. Semua orang perlu memaparkan kod pengesahan. Selain itu, input aksara pengesahan oleh pengguna juga perlu sepadan dengan aksara pengesahan dalam imej.
Jadi aksara pengesahan harus dikembalikan untuk disimpan dan digunakan kemudian.
imagedestroy($img); return $string;
Mari kita lihat semua fail fungsi PHP yang disediakan Kami akan merangkumkan kod di atas ke dalam fungsi bersatu untuk dipelajari dan digunakan oleh semua orang:
<?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)); } ?>