常规验证码制作
来源:互联网 发布:点对点视频软件 编辑:程序博客网 时间: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');
- 常规验证码制作
- 常规javascript前台验证
- 常规javascript前台验证
- 常规javascript前台验证
- PHP常规正则验证
- java常规正则验证
- 验证码的制作
- 验证码的制作
- 验证码的制作
- JSP制作验证码
- javaScript制作验证码
- 验证码的制作
- java验证码制作
- JSP制作验证码
- 验证码的制作
- 网页验证码制作
- 验证码的制作
- 制作图片验证码
- 算法 一致性哈希算法
- excel数据分析--vlookup函数的使用
- 文章标题
- C语言链表-创建链表并且从键盘输入赋值
- css3之2d转换(transform方法)
- 常规验证码制作
- Dijkstra(迪杰斯特拉)算法模板
- 一个简单的Servlet登陆案例
- 更换kernel的logo
- LeetCode笔记 -- LongestSubStringLength
- 工厂方法(factory-method)模式
- IARSTM8 "unable to allocate space for sections "问题解决与改良
- Springboot学习笔记(四)
- 给定一个英文字符串,请写一段代码找出这个字符串中首先出现三次的那个字符。