php图片验证码如何实现,利用php实现图片验证码教程

最近要做学校的项目,为了安全要用到图片验证技术,所以就找了找文章,

肯了些时间,把自己的心得写出来,也算是说下自己的理解吧,

用理解错误的地方请指正,我也是菜菜,

我拿一篇写的不错的文章来分析,或者按照自己的思路来看他的代码.

php图片验证技术关键的是用个函数

imagestring()这个函数,老样子看下函数原型,对理解会有好大的帮助

//int imagestring(resource image,int font,int x,int y,string s, int col);

看下手册会有好多帮助

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

这里主要有三个关键参数

resource image,string s ,int col

1,

下面来看看

resource image ,int col

这二个一起分析,为啥,慢慢来看

这个image是划好的图

要划图,要遵循几步

1.1

第一是创建图像文件流

imagecreate()当然用imagecreateturecolor()也可以,

这里用imagecreate来例子,

老方法看函数原型和手册的解释

resource imagecreate ( int x_size, int y_size)

imagecreate() 返回一个图像标识符,代表了一幅大小为 x_size 和 y_size 的空白图像。

那么咱们就可以使用它来创建一个空白图像.

$im=imagecreate(90,30);

1.2

因为是空白的,所以要找给它填充的颜色

用到这个函数

imagecolorallocate()

看原型和手册

int imagecolorallocate ( resource image, int red, int green, int blue)

imagecolorallocate() 返回一个标识符,代表了由给定的 RGB 成分组成的颜色。image 参数是 imagecreate() 函数的返回值。red,green 和 blue 分别是所需要的颜色的红,绿,蓝成分。这些参数是 0 到 255 的整数或者十六进制的 0x00 到 0xFF。imagecolorallocate() 必须被调用以创建每一种用在 image 所代表的图像中的颜色。

看下最后一句,imagecolorallocate() 必须被调用以创建每一种用在 image 所代表的图像中的颜色,那么咱们来建立几种颜色,来方便以后的填充,同时这个颜色也是

这里主要有三个关键参数

resource image,string s ,int col

int col 的颜色设置

我们来方便设置三个颜色吧

$red=imagecolorallocate($im,255,0,0);

$white = ImageColorAllocate($im, 255,255,255);

$gray = ImageColorAllocate($im, 200,200,200);

这三个不用解释了吧,就是r g b 配合出来的颜色.

1.3,

既然空白图像和填充颜色已经出来了,那我们来填充吧

用到这个函数

imagefill()

int imagefill ( resource image, int x, int y, int color)

imagefill() 在 image 图像的坐标 x,y(图像左上角为 0, 0)处用 color 颜色执行区域填充(即与 x, y 点颜色相同且相邻的点都会被填充)。

imagefill($im,0,0,$white);//用白色填充是为了让干扰素更好的起作用

那这样我的三个参数中其中二个参数已经解决了,resource image,int col

我们来看第二个参数string s;

2

第二个参数string s

2,1

因为是验证码,防止恶意攻击,那么一定要设置成随机出来的那样才不会出问题,

srand((double)microtime()*1000000);//播下一个生成随机数字的种子,以方便下面随机数生成的使用,

生成数字和字母混合的验证码

$ychar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";

$list=explode(",",$ychar);//explode函数比较简单,就是提前每个间隔,的字符并把他们组成数组,不理解的看下手册吧,很容易理解的

已经产生了一个包含这36个字符的数组,剩下的就是让他们产生随机的四位数了

for($i=0;$i<4;$i++){

$randnum=rand(0,35);

$authnum.=$list[$randnum]." ";//ed 加入一个空格

}

这个循环,循环的次数是四次,我还是在解释下吧,其实很简单,

假设第一次循环,rand(0,35)意思是随机出现0到35之间的数组

假设是第0个,那么就是1 $authnum=1."";

第二次循环

如果$randum=12,那么$authnum=1.$list[$randnum]."";

也就是$authnum=1 C;

如此循环到第四位,

那么就这样产生了随机的四位数,

既然三个参数我们都解决了,那么就可以用

imagestring()函数来创建图片了,

imagestring($im, 5, 10, 3, $authnum, $red);

创建了以后,我们要输出图片

imagepng($im);

imagedestroy($im);

同时我们要在文件头说明,要输出的文件的类型

Header("Content-type: image/PNG");

3

其实功能是实现了,但是为了更好的安全,我们要加入干扰素,

啥是干扰素就是干扰的因素呗,哈

用到这个函数

int imagesetpixel ( resource image, int x, int y, int color)

imagesetpixel() 在 image 图像中用 color 颜色在 x, y 坐标(图像左上角为 0, 0)上画一个点。

看他的解释,在画一个点,所以咱们肯定要用个循环了,

就是多画几个点,哈

for($i=0;$i<400;$i++){ //加入干扰象素

$randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255));

imagesetpixel($im, rand()%90 , rand()%30 , $gray);

}

for循环的第一个,产生随机的颜色,当然也可以使用咱们上面定义的

这里用的就是上面定义的$gray,那个400是产生的像素点的个数

没啥要解释的了吧

顺便把我看的那个好的文章帖下来,

CODE:

//FileName:authimg.php

//Description:

//Creater:alvar

//Createtime:2006-5-4

//Lastmodtime:

session_start();

?>

//生成验证码图片

Header("Content-type: image/PNG");

srand((double)microtime()*1000000);//播下一个生成随机数字的种子,以方便下面随机数生成的使用

//session_start();//将随机数存入session中

$_SESSION['authnum']="";

$im = imagecreate(90,20) or die("Cant's initialize new GD image stream!"); //制定图片背景大小

$red = ImageColorAllocate($im, 255,0,0); //设定三种颜色

$white = ImageColorAllocate($im, 255,255,255);

$gray = ImageColorAllocate($im, 200,200,200);

//imagefill($im,0,0,$gray); //采用区域填充法,设定(0,0)

imagefill($im,0,0,$white);//ed

//生成数字和字母混合的验证码方法

$ychar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";

$list=explode(",",$ychar);

for($i=0;$i<4;$i++){

$randnum=rand(0,35);

$authnum.=$list[$randnum]." ";//ed 加入一个空格

}

//while(($authnum=rand()%100000)<10000); //生成随机的四位数

//将四位整数验证码绘入图片

$_SESSION['authnum']=$authnum;

//int imagestring(resource image,int font,int x,int y,string s, int col)

imagestring($im, 5, 10, 3, $authnum, $red);

//用col颜色将字符串s画到image所代表的图像的x,y座标处(图像的左上角为0,0)。

//如果 font 是 1,2,3,4 或 5,则使用内置字体

for($i=0;$i<400;$i++){ //加入干扰象素 {

$randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255));

// imagesetpixel($im, rand()%90 , rand()%30 , $randcolor);

imagesetpixel($im, rand()%90 , rand()%30 , $gray);

}

ImagePNG($im);

ImageDestroy($im);

?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值