2012年10月31日星期三

PHP 5 中图片验证码的制作

一、应用场景

    在 WEB 网站中,图片验证码经常被用来防止恶意地用户注册、发帖等场景。在 PHP 中,图片验证码主要是通过 GD 库提供的 API 来完成的。

二、实现的方法

    验证码一般都是随机的数字和字母组合的,可以通过随机函数,十六进制函数 dechex 简单实现。最关键的问题还是怎样生成图片。

<?php
//生成随机数-》创建图片-》随机数写进图片 -》输出到浏览器

for($i=0;$i<4;$i++{
  $rand .= dechex(rand(1,15));
}
  
$im imagecreatetruecolor(100,30);// 新建一个真彩色图像  x就是宽 ,y就是高

//设置颜色

// 为一幅图像分配颜色(相当于 PhotoShop 的调色板)

// imagecolorallocate ( resource image, int red, int green, int blue )  返回一个标识符,代表了由给定的 RGB 成分组成的颜色。

$bg imagecolorallocate($im,0,0,0);//第一次对 imagecolorallocate() 的调用会给基于调色板的图像填充背景色。代表了由给定的 RGB 成分组成的颜色
  
$te imagecolorallocate($im,225,225,225);


//把字符串写在图像左上角

//绘图函数  imagestring ( resource image, font, int x, int y, string s, int col ) 

//用 col 颜色将字符串 s 画到 image 所代表的图像的 x,y 坐标处(这是字符串左上角坐标,整幅图像的左上角为 0,0)。如果 font 是 1,2,3,4 或 5,则使用内置字体。  

imagestring($im,5,rand(3,70),rand(0,16),$rand,$te);

//直接输出图像到浏览器
header("Content-type: image/jpeg");

// imagejpeg ( resource image [, string filename [, int quality]] )  filename 参数为可选,如果省略,则原始图像流将被直接输出。要省略 filename 参数而提供 quality 参数,使用空字符串('')。通过 header() 发送 Content-type: image/jpeg 可以使 PHP 脚本直接输出 JPEG 图像。

imagejpeg($im);
?>

三、制作复杂的图片验证码

     有时验证码为了防止被一些图片识别工具识别,必须设置一些干扰。例如在图片上随机加上一些线条或者点。这主要通过 imageline() 和 imagesetpixel() 函数来实现。甚至制作中文验证码。

<?php

for($i=0;$i<4;$i++{
  $rand .= dechex(rand(1,15));
}
  
$im imagecreatetruecolor(100,30);

$bg imagecolorallocate($im,0,0,0);
  
$te imagecolorallocate($im,225,225,225);

//画线条
for($i=0$i<3$i++){
  $te2 imagecolorallocate($im,rand(0,225),rand(0,225),rand(0,225));
//imageline ( resource image, int x1, int y1, int x2, int y2, int color )  用 color 颜色在图像 image 中从坐标 x1,y1 到 x2,y2(图像左上角为 0, 0)画一条线段。 
  imageline($im,rand(0,100),0,rand(0,100),rand(0,30),$te2);
}
//画点
for($i 0$i 100$i++){
  //imagesetpixel ( resource image, int x, int y, int color ) 在 image 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。 
  imagesetpixel($im,rand()%100,rand()%30,$te2);
}
  
$str iconv("gbk","UTF-8","验证码");//把gbk编码转换成UTF-8,如果文件的编码是 UTF-8,则不需要这一步。因为我们的系统(Windows)自带的字体默认是用国际通用编码(UTF-8)模式来识别的,所以如果不做编码转换,可能无法正常显示。
imagettftext($im,12,rand(0,10),20,20,$te,'msyh.ttf',$str);//rand(3,10)倾斜度。msyh.ttf 是微软雅黑字体,可在 C:\Windows\Fonts (Windows XP、Windows 7)找到。然后拷贝到该文件的目录。Windows 下之所以能够显示中文,是因为系统安装了中文字体

header("Content-type: image/jpeg");

imagejpeg($im);
?>


没有评论:

发表评论