ホームページ  >  記事  >  バックエンド開発  >  文字化けを実現するPHP画像検証コード機能の実装コード

文字化けを実現するPHP画像検証コード機能の実装コード

WBOY
WBOYオリジナル
2016-07-25 08:51:391218ブラウズ
  1. /**

  2. * CaptchaImage() - 歪んだ文字を含む検証コード画像を作成します
  3. * $session_name string 検証コード画像の作成時に生成する必要があるセッションの変数名
  4. * $width int 検証画像の幅、デフォルトは 120 , 注: 画像の高さと幅の比率は比較的固定です
  5. * $noise int インターフェロンポイントの数、デフォルトは 0 です
  6. * $disturb int 干渉文字の数、デフォルトは 0 です
  7. * $curve bool 増やすかどうか干渉曲線、デフォルトは true です
  8. **/
  9. function CaptchaImage($session_name = '', $width = 120, $noise = 0, $disturb = 0, $curve = true){
  10. $im_x = $width;
  11. $im_y = ceil(0.25 * $width);
  12. $im = imagecreatetruecolor($im_x, $im_y);
  13. $text_c = ImageColorAllocate($im, mt_rand(0, 100), mt_rand(0) , 100), mt_rand(0, 100));
  14. $gray_rand = mt_rand(160, 220);
  15. $buttum_c = ImageColorAllocate($im, $gray_rand, $gray_rand, $gray_rand);
  16. imagefill($im, 0, 0, $buttum_c);

  17. session_start();

  18. $text = '';
  19. $characters = 'ABCEFGHJKLMNPQRSTUVWXYZ';
  20. for($i = 0, $len = strlen($characters) ); $i $text .= $characters{rand(0, $len - 1)};
  21. if(isset($session_name{0}) && session_start()){
  22. $ _SESSION[$session_name] = $text;
  23. $_SESSION['CaptchaSessionTime'] = time();
  24. }
  25. }

  26. $font = 'arial.ttf';

  27. $size = フロア(0.2 * $width);

  28. $ttfbox = imagettfbbox($size, 0, $font, $text);

  29. $text_width = abs($ttfbox[2] - $ttfbox[0] ]);
  30. $side = Floor(($im_x - $text_width) / 2);

  31. $array = array(-1, 1);

  32. for ($i = 0; $i $p = array_rand($array);
  33. $an = $array[$p] * mt_rand(5, 10); // 字符倾斜め角度
  34. imagettftext($im, $size, $an, $side + $i * ($size - 1), $im_y - 3, $text_c, $font, $text{$i});
  35. }

  36. $distortion_im = imagecreatetruecolor ($im_x, $im_y);

  37. imagefill($distortion_im, 0, 0, $buttum_c);
  38. $distortion = Floor(0.04 * $width); // 扭曲度
  39. for ($i = 0; $i < $im_x; $i++){
  40. for ($j = 0; $j < $im_y; $j++){
  41. $rgb = imagecolorat($im , $i , $j);
  42. if( (int)($i + sin($j / $im_y * 2 * M_PI) * $distortion) <= $im_x && (int)($i + sin($ j / $im_y * 2 * M_PI) * $distortion) >= 0 ){
  43. imagesetpixel($distortion_im, (int)($i + sin($j / $im_y * 2 * M_PI - M_PI * 0.1) * $歪み) , $j, $rgb);
  44. }
  45. }
  46. }

  47. if($disturb > 0){

  48. $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  49. for($i = 0 ; $i < $disturb; $i++){
  50. imagestring($distortion_im, 3, mt_rand(-10, $im_y), $chars[mt_rand(0, 35)] text_c);
  51. }
  52. }

  53. //干扰象素を追加;

  54. if($noise > 0){
  55. for($i = 0; $i < $noise; $ i++){
  56. $randcolor = ImageColorallocate($distortion_im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
  57. imagesetpixel($distortion_im, mt_rand()%$im_x , mt_rand()%$im_y , $randcolor );
  58. }
  59. }

  60. // 加干扰曲線

  61. if($curve){
  62. $rand = mt_rand(5, 30);
  63. $rand1 = mt_rand(15, 25);
  64. $rand2 = mt_rand(5, 10);
  65. for ($yy = $rand; $yy for ($px = -60; $px $x = $px / $rand1;
  66. $y = ($x != 0) ? sin($x) : $y;
  67. $py = $y * $rand2;
  68. imagesetpixel($distortion_im, $px + 60, $py + $yy, $text_c);
  69. }
  70. }
  71. }
  72. //設置文件头;

  73. Header("Content-type: image/JPEG");

  74. //PNG 形式で画像を浏览器または文件に出力します。

  75. ImagePNG($distortion_im);

  76. //销毁一画像、释放与画像关联的内部保存;

  77. ImageDestroy($distortion_im);
  78. ImageDestroy($im);
  79. }
  80. CaptchaImage('code', 100); // 一枚の写真を生成し、コードのキーのセッション中に電子数字を保存します

复制代


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