网页中的带有文字图案的验证码是怎样生成的

编辑:管理员 发布时间:2022-02-09 16:14:26456

在我们浏览操作网站时,经常会遇到各种各样的文字字符以及线条图案组成的验证码,那么这些文字组成的验证码是怎样生成的呢?

这里以php代码为例:

首先我们需要创建两个页面。一个为前端显示验证码的页面:

创建一个名称为yzm.php的空白页在其中写上:

<?php

session_start();

if(isset($_POST['yyz'])){

if($_POST["yyz"] == $_SESSION["yyz"]){

echo"验证码正确!";

}else{

echo"验证码错误";

}

}

?>

<form action="/" method="post">

<img src="yzm.php"/>

<input name="yyz type="text" "/>

<input type="submit" value="提交"/>

</form>

php部分用来接受提交的验证码,判断是否与阶段变量传递的验证码相同相同,通过相同则执行正确的操作,如果错误则显示验证错误提示.

然后分别创建一个img图片标签、input文本框、以及提交按钮.

其中form表单用来发送验证信息,在图片img标签地址中填入yzm.php动态地址,用来动态显示图片验证码,文本框用来输入看到的数字,提交按钮用来提交验证参数.

接下来就是创建用来显示动态图片的yzm.php文件了.

代码如下:

<?php

session_start();

$wenzi = "这是一段验证文字组合";

//获取字符的长度

$zifuchangdu = mb_strlen($wenzi,"UTF-8");

//将字符转为数组

$zifuyanzheng = array();

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

$zifuyanzheng[$i] = mb_substr($wenzi, $i,1,"UTF-8");

}

$huizhiwenzi = "";

// 图片上的文字

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

$suiji=rand(0, 1);

if($suiji==0){

$huizhiwenzi.=$zifuyanzheng[rand(0, $zifuchangdu-1)];

}else{

$huizhiwenzi.=dechex(rand(0,15));

}

}

$yzmimg = imagecreatetruecolor(130, 30);

$ztys = imagecolorallocate($yzmimg, 255,255,255);

imagettftext($yzmimg, 13, rand(2, 9), 20 ,20, $ztys, "字体名称.TTF",$huizhiwenzi);

$_SESSION["yyz"] = $huizhiwenzi;//传递阶段变量

$zft = imagecolorallocate($yzmimg, rand(0, 255),rand(0, 255),rand(0, 255));

//分配随机色

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

imagesetpixel($yzmimg, rand(1, 130), rand(1, 30), $zft);

}

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

imageline($yzmimg, 0, rand(0, 20), rand(70,130), rand(0, 20), $ztys);

}

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

imagejpeg($yzmimg);

?>

这里我们主要用到了php中的GD图形库来生成动态图片.

GD图形库提供了全面的处理图片的API,我们只需要使用GD库就能够处理或生成图片,当然除了gd库php中还有功能更为强大的Imagick库或MagickWandForPHP函数来调用ImageMagick软件处理调整图片.

首先我们了解以下gd库中用到的一些函数信息:

imagesetpixel 绘制像素点

imageline 绘制线条

imagestring 绘制字符文字

imagecreatetruecolor为新建真彩色图像

imagecolorallocate 为图像分配颜色

imagejpeg 输出图片

大致的原理就是先创建一个用于验证的文字库,然后将文字库中的每个文字转出数组,通过rand函数提取出文字库中随机几个字符作为验证码的文字.

使用imagecreatetruecolor函数创建一个宽130高度为30px的图片,imagecolorallocate为其分配背景色

imagettftext在图片上写上字符,imageline画出干扰线条,imagecolorallocate添加些大小不一圆圈,用来防止机器识别.

设置http头的信息,设置为发送显示的是image中的jpeg格式.用imagejpeg直接生成显示图片.

最后将两个页面一组合,就可以简单的实现网站页面中对验证码的验证以及随机字符图片的生成.

TAGS: php 图片处理
热门文章
最新文章

热门标签

数学计算路径命令行表单字符符号nginxcookiejavapython数组文字处理小数服务器管理apache图片处理