2008-04-27

PHP生成验证码实例!

今天花了些时间研究了如何用PHP生成验证码。主要是学习GD库的图像处理函数。只要熟悉了这些函数,利用PHP对图像进行操作还是挺方便的。下面是我写的生成验证码的实例代码,各个步骤都写上注释了,相关的函数请查阅手册。最终的效果还是不错的o(∩_∩)o...如果你有更好的想法,欢迎与我交流!

PHP代码
  1. <?php   
  2. //-------------------------------------   
  3. // 文件说明:生成验证码   
  4. // 文件作者:Jesse Lee   
  5. // 作者主页:http://www.lisijie.com.cn   
  6. // 最后更新:2008-4-27   
  7. //-------------------------------------   
  8.   
  9. session_start();   
  10. //不存在imageCreate函数则认为当前环境不支持GD库   
  11. if (function_exists('imagecreate')) {   
  12.     //产生4个字符的随机字符串作为验证码   
  13.     $str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";   
  14.     $code = array();   
  15.     for ($i=0; $i<4; $i++) {   
  16.         $code[] = $str[mt_rand(1,strlen($str))];   
  17.     }   
  18.     //将验证码写入到Session,忽略大小写   
  19.     $_SESSION['vdcode'] = strtolower(implode('',$code));   
  20.   
  21.     $width = 50;    //图片宽度   
  22.     $height = 20;   //图片高度   
  23.   
  24.     $im = ImageCreate($width,$height);  //创建图形   
  25.     ImageColorAllocate($im,255,255,255); //填充背景颜色为白色   
  26.   
  27.     //用淡色给图形添加杂色   
  28.     for ($i=0; $i<100; $i++) {   
  29.         $pxcolor = ImageColorAllocate($im,mt_rand(100,255),mt_rand(100,255),mt_rand(100,255));   
  30.         ImageSetPixel($im,mt_rand(0,$width),mt_rand(0,$height),$pxcolor);   
  31.     }   
  32.   
  33.     //用深色调绘制边框   
  34.     $bordercolor = ImageColorAllocate($im,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));   
  35.     ImageRectangle($im,0,0,$width-1,$height-1,$bordercolor);   
  36.   
  37.     //用比较明显的颜色写上验证码文字   
  38.     $offset = 5;   
  39.     foreach ($code as $char) {   
  40.         $textcolor = ImageColorAllocate($im,mt_rand(0,250),mt_rand(0,150),mt_rand(0,250));   
  41.         ImageChar($im,5,$offset,2,$char,$textcolor);   
  42.         $offset += 10;   
  43.     }   
  44.   
  45.     //禁止缓存   
  46.     header("pragma:no-cache\r\n");   
  47.     header("Cache-Control:no-cache\r\n");   
  48.     header("Expires:0\r\n");   
  49.     //检查系统支持的文件类型,优先级为PNG->JPEG->GIF   
  50.     if (ImageTypes() & IMG_PNG) {   
  51.         header('Content-Type:image/png');   
  52.         ImagePNG($im);   
  53.     } elseif (ImageTypes() & IMG_JPEG) {   
  54.         header('Content-Type:image/jpeg');   
  55.         ImageJPEG($im);   
  56.     } else {   
  57.         header('Content-Type:image/gif');   
  58.         ImageGif($im);   
  59.     }   
  60. else {   
  61.     //不支持GD库,则输出默认验证码ABCD   
  62.     $_SESSION['vdcode'] = 'abcd';   
  63.     header('Content-Type:image/jpeg');   
  64.     $fp = fopen('vdcode.jpg','rb');   
  65.     echo fread($fp,filesize('vdcode.jpg'));   
  66.     fclose($fp);   
  67. }   
  68. ?>  

不支持GD库的情况下输出的图片

标签:PHP 验证码 | 作者:admin | 分类:网站开发 | 评论: | 浏览: