利用php生成验证码

  1. <?php
  2. /**
  3. * php生成<a href="http://www.phpfensi.com/zhuanti/yanzhengma/" class="anchor" target="_blank">验证码</a>
  4. * @param $width 画布宽
  5. * @param $height 画布高
  6. * @param $vcodelen 验证码长度
  7. * @param $pointnum 干扰像素点数量
  8. * @param $linenum 干扰线条数量
  9. *
  10. * 思路:创建验证码画布,生成并填充背景色,生成验证码内容/干扰像素点/线,填充到画布,输出。
  11. */
  12. $width= 100;
  13. $height= 30;
  14. $vcodelen= 4;
  15. $pointnum= 200;
  16. $linenum= 3;
  17. // 创建画布
  18. $image= imagecreatetruecolor($width,$height);
  19. // 创建色块
  20. $bgcolor= imagecolorallocate($image, 255, 255, 255);
  21. // 填充画布背景色
  22. imagefill($image, 0, 0,$bgcolor);
  23. // 验证码内容
  24. for($i=0;$i<$vcodelen;$i++) {
  25. // <a href="/tags.php/%D7%D6%CC%E5%B4%F3%D0%A1/" target="_blank">字体大小</a>
  26. $fontsize= 5;
  27. // 字体颜色,颜色在限定范围内随机
  28. $fontcolor= imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120));
  29. $data='abcdefghijklmnopqrstuvwxyz0123456789'
  30. // 验证码内容在以上字符串内随机截取
  31. $fontcontent=<a href="/tags.php/substr/" target="_blank">substr</a>($data, rand(0,strlen($data)),1);
  32. // 字符串显示位置
  33. $x= ($i*$width/4)+rand(5,15);
  34. $y= rand(5,10);
  35. // 字符串填充图片
  36. // imagestring的字体大小可选1-5,字体再大需要用imagettftext函数(需要字体文件)
  37. imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
  38. // imagettftext($image, $fontsize, 0, $x, $y, $fontcolor, '/font/Geneva.dfont', $fontcontent);
  39. }
  40. // 干扰像素点
  41. for($i=0;$i<$pointnum;$i++) {
  42. $pointcolor= imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120));
  43. // 画布填充像素点函数
  44. imagesetpixel($image, rand(0,$width), rand(0,$height),$pointcolor);
  45. }
  46. // 干扰线条
  47. for($i=0;$i<$linenum;$i++) {
  48. $linecolor= imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120));
  49. // 画布填充线条函数
  50. imageline($image, rand(0,$width), rand(0,$height), rand(0,$width), rand(0,$height),$linecolor);
  51. }
  52. // 图片输出格式
  53. header('content-type: image/png');
  54. // 输出验证码图片
  55. imagepng($image);
  56. // 销毁画布
  57. imagedestroy($image);
  58. ?>