常规验证码制作

来源:互联网 发布:点对点视频软件 编辑:程序博客网 时间:2024/06/04 19:32

GD图片的制作

效果图如下:

第一步:创建画布

创建画布有两个函数:

imagecreate(width,height);

作用:创建画布,只能有256种颜色!

imagecreatetruecolor(width,height);

作用:创建真彩色画布

 

什么叫真彩色?24位真彩色

三原色:rgb

red:0-255   刚好可以使用一个字节(8个bit位)来存储

green:0-255   刚好可以使用一个字节(8个bit位)来存储

blue:0-255   刚好可以使用一个字节(8个bit位)来存储

所以,一共可以表示28*28*28 = 224种颜色!

得到了一个画布资源!

第二步:为画布创建一种颜色

注意:

所有需要在画布上呈现的颜色,都必须事先分配给画布!

通过一个函数来实现:

imagecolorallocate(image,red,green,blue);

其中:img是一个画布资源,后面的rgb代表一个颜色!

该函数的作用就是得到一个颜色的句柄(是一个int的数值)

第三步:绘制文字(画画)

文字又可以分成两种:

一种是简单的文字,ASCII码,另一种是复杂的文字,比如中文!

 

绘制文字需要使用一个函数:

imagestring(img,size,x,y,string,color);

 

其中:

img:画布资源

size:文件的大小,这里只能是1-5,并且5是最大的

x,y:起始坐标

string:文字内容

color:是颜色句柄

 

第四步:输出或者保存图片

输出图片

此时,需要使用函数:imagepng|imagejpeg|imagegif

 

imagepng(img)

此时,img就是画布资源!

此时,我们应该要去服务器在作出响应的时候告诉浏览器,反馈给浏览器的数据是一个图片而不是html文件!

此时,我们需要在输出图片之前使用header函数来设置响应头信息:

Header(“content-type:image/png”)

保存图片

还是使用imagepng这种系列的函数,只是多了第二个参数,就是一个保存的路径

需要特别注意的一个地方:

 

在使用imagepng函数输出图片的时候,前面不能有任何的输出!

所以,为了避免项目中出现类似的问题,可以在输出图片之间,先清理数据缓冲区:

这个时候,就需要使用一个函数ob_clean来完成!

建议,无论在任何时候,在输出图片之间都使用ob_clean来清理数据缓冲区!

 

产生随机验证码字符串

第一步:拼凑出一个数组(包含大小写字母和数字)

基本策略:使用两个函数来完成

range(‘a’,’z’);

array_merge: 如$arr=array_merge(range('a','z'),range('A','Z'),range(0, 9));

第二步:打乱该数组

使用shuffle函数:

第三步:使用array_rand随机抽取若干个数组的下标值

第四步:根据获得的下标遍历获得原数组的值

制作验证码

需要使用的函数

填充背景

使用imagefill函数

imagefill(img,x,y,color);

其中:

img:画布资源

x,y:坐标点

color:要填充的颜色句柄

填充的意思就是填充一块连续的颜色相同的区域!

添加干扰线

添加干扰线的本质就是绘制直线!

需要使用imageline(img,x1,y1,x2,y2,color)

其中:

img:画布资源

x1,y1,x2,y2:两点的坐标

color:颜色句柄

 

添加噪点(干扰点)

所谓的一个噪点就是一个干扰点,一个干扰点就是一个像素!

需要使用imagesetpixel(img,x,y,color);

 

 

 

 

 

代码实现

<?php

//1.创建画布

$img=imagecreatetruecolor(170, 40);

 

//2.填充背景色

//2.1创建背景的颜色

$backcolor=imagecolorallocate($img,mt_rand(180,255), mt_rand(180,255), mt_rand(180,255));

//2.2填充背景

imagefill($img, 0, 0, $backcolor);

 

//3.产生随机验证码字符串

//3.1利用arrar_merge和range函数拼凑出一个数组

$arr=array_merge(range('a','z'),range('A','Z'),range(0, 9));

//3.2打乱数组

shuffle($arr);

//3.3随机抽取若干个数组的下标值

$rand_key=array_rand($arr,4);

//3.4根据获得的下标遍历获得原数组的值

$str='';

foreach ($rand_key as $value) {

         $str.=$arr[$value];//

}

 

//8.将验证码字符串保存到session中

session_start();

$_SESSION['captcha']=$str;

 

//4.将验证码字符串写到图片上

//4.1计算字符间距

$span=ceil(170/(4+1));

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

         $stringcolor=imagecolorallocate($img,mt_rand(0,100), mt_rand(0,100), mt_rand(0,100));

         imagestring($img,5, $i*$span, 10, $str[$i-1], $stringcolor);//水平地画一行字符串

}

//5.填加干扰线

for($i=1;$i<=8;$i++){

//5.1创建干扰线颜色

         $linecolor=imagecolorallocate($img,mt_rand(100,180), mt_rand(100,180), mt_rand(100,180));

         imageline($img,mt_rand(0,169), mt_rand(0,169), mt_rand(0,39), mt_rand(0,39), $linecolor);

}

//6.添加噪点(干扰点)

for($i=1;$i<=170*40*0.05;$i++){

         $pixelcolor=imagecolorallocate($img,mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));

         imagesetpixel($img,mt_rand(0,169), mt_rand(0,39), $pixelcolor);

}

//7.输出图片

//设置响应头信息

header("content-type:image/png");

//清理数据缓存区

ob_clean();

//输出图片

imagepng($img);

//保存图片

imagepng($img,'./Hello.png');


原创粉丝点击