php 图文验证码demo,关于图片验证码的练习回顾

这两天学习了关于网页中图片验证码的简单制作,现总结下,算是对自己的一个小小认可,实验测试分为两大快,前台的提交验证快和后台的生成验证码块

实现原理:

图片中的待验证码在后台随机生成之后,赋值给session,将前台页面提交的值与已保存的session值进行比较来判断正确与否,现在看看代码块

前台页面index.html  关于含中文的验证<?php

/* 图片验证码

注意:1、由于涉及到session的操作,在页面代码一开始,需启用session

2、对于含有中文的验证码,需在前台页面的meta中将字符编码设为 UTF-8

*/

session_start();

@$sub = $_POST['sub'];

@$name = $_POST['text1'];

if(!empty($sub))

{

if($name == $_SESSION['check_pic'])

{

echo "验证成功:".$_SESSION['check_pic'];

}

else

{

echo "验证失败,正确的验证码为: \"".$_SESSION['check_pic']."\"";

}

}

?>

图片验证码

demo4.php

后台生成验证码块 demo4.php

/* php 图片验证码的制作

部分GD库函数介绍

第一步:设置真色彩图像

第二步:为一幅图像分配颜色

第三步:确认向图像写入的字符串并进行写入操作

第四步:输出图像

注意:对于含有中文的验证码,需在前台页面的meta中将字符编码设为 UTF-8

*/

session_start();  //开启sessiong功能,便于图片验证码的验证

//第一步:设置真色彩图像

$img = p_w_picpathcreatetruecolor(100,35); //创建长宽粉分别为100px,35px的图片模板,默认为黑色

//第二步:为一幅图像分配颜色

//方案一:不使用带透明度的颜色

$color = p_w_picpathcolorallocate($img,rand(200,250),rand(150,240),rand(100,200));

//方案二:使用为一幅图像分配具有透明度的颜色

// $color = p_w_picpathcolorallocatealpha ($img,rand(200,250),rand(150,240),rand(100,200),50);

/*

p_w_picpathcolorallocatealpha() 的行为和 p_w_picpathcolorallocate() 相同,但多了一个额外的透明度      参数 alpha,其值从 0 到 127。0  表示完全不透明,127 表示完全透明。

*/

//使用画点函数p_w_picpathsetpixel循环画一个个单一的像素点,增加干扰性,循环次数可自定义

for($i=0; $i<50; $i++)

{

p_w_picpathsetpixel($img,rand(0,100),rand(0,35), $color);

}

//设定图像的混色模式

p_w_picpathalphablending($img,true);

/*

p_w_picpathalphablending — 设定图像的混色模式

bool p_w_picpathalphablending ( resource $p_w_picpath , bool $blendmode )

允许在真彩×××像上使用两种不同的绘画模式。在混色(blending)模式下,alpha 通道色彩成     分提供给所有的绘画函数,例如p_w_picpathsetpixel()决定底层的颜色应在何种程度上被允许照射透       过。作为结果,GD自动将该点现有的颜色  和画笔颜色混合,并将结果储存在图像中。结果的像     素是不透明的。

在非混色模式下,画笔颜色连同其 alpha 通道信息一起被拷贝,替换掉目标像素。混色模式在画     调色板图像时不可用。如果 blendmode为 TRUE, 则启用混色模式,否则关闭。成功时返回         TRUE,或者在失败时返回 FALSE.

*/

//是否使用抗锯齿(antialias)功能

p_w_picpathantialias ($img,true);

/*

bool p_w_picpathantialias ( resource $im , bool $on )  是否使用抗锯齿(antialias)功能

对线段和多边形启用快速画图抗锯齿方法。不支持 alpha 部分。使用直接混色操作。仅用于真    彩×××像。不支持线宽和风格。

使用抗锯齿和透明背景色可能出现未预期的结果。混色方法把背景色当成任何其它颜色使用。    缺乏 alpha 部分的支持导致不允许基于 alpha 抗锯齿方法。

Note: 此函数仅在与 GD 库捆绑编译的 PHP 版本中可用。

*/

//画线条

for($i=0; $i<2; $i++)

{

$color1 = p_w_picpathcolorallocate($img,rand(200,250),rand(150,240),rand(100,200));

//为了区分图片色彩与线条的颜色

p_w_picpathline($img,rand(0,30),rand(0,30),rand(60,95),rand(10,35),$color1);

}

//第三步:向图像写入字符串

//方案一: 使用p_w_picpathttftext()向图像中写入字符串,兼容中文

$str2 = "多 了 一 个 额 外 的 透 明 度 参 数";  //用于随机产生的中文字符串,可自定义,

$arr = explode(" ",$str2);

$arr_len = count($arr)-1;

//由于数组的默认下标从0开始,保证在使用rand(int min,int max)函数可随机输出数组中的任一键值,对数组长度需减1

$text=null;

for($i=0; $i<4;$i++)  //使用过for循环产生验证码的个数

{

$text.=$arr[rand(0,$arr_len)];

}

$str= iconv("gb2312","UTF-8",$text); //此时,前台的网页字符编码也许为UTF-8,否则会出现乱码

p_w_picpathttftext($img,15,0,10,25,$color,"FZXKJW.TTF",$str);

//方案二:使用p_w_picpathstring()向图片中水平的写入一行字符串

/*

$str="";

for($i=0; $i<5;$i++)

{

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

}

p_w_picpathstring($img,rand(5,6),rand(15,25),rand(5,10),$str,$color);

*/

$_SESSION['check_pic'] = $str; //将产生的随机数保存在session中,便于调取此后验证

//第四步:输出图像

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

p_w_picpathjpeg($img);

?>

***************************************************************

其中,用到的相关函数如下:

1、设置真色彩图像:新建一个指定大小的真色彩图像,也就是图像模板

resource p_w_picpathcreatetruecolor ( int $x_size , int $y_size )

返回一个图像标识符,代表了一幅大小为 x_size 和 y_size  的黑色背景图像

Note:

此函数需要 GD 2.0.1 或更高版本(推荐 2.0.28 及更高版本)。

本函数不能用于GIF 文件格式。

2、为一幅图像分配颜色

int p_w_picpathcolorallocate ( resource $p_w_picpath , int $red , int $green , int $blue )

返回一个标识符,代表了由给定的 RGB 成分组成的颜色。red,green 和 blue 分别是所需要的    颜色的红,绿,蓝成分。这些参数是 0 到 255 的整数或者十六进制的 0x00 到 0xFF。

p_w_picpathcolorallocate() 必须被调用以创建每一种用在p_w_picpath 所代表的图像中的颜色。

3、向图像写入字符串:绘图函数

bool p_w_picpathstring ( resource $p_w_picpath, int $font, int $x, int $y, string $s, int $col)

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

4、输出图像

p_w_picpath与header输出的介绍

PHP的header是定义头的动作,支持三种类型

Content-Type: xxxx/yyyy

—>内容文件的类型 如 p_w_picpath/gif p_w_picpath/jpegg  p_w_picpath/png

Location:xxxx:yyyy/zzzz

—>跳转链接地址 如: Location: http://www.baidu.com

Status:nnn xxxxx

设置头部:header("Content-type: p_w_picpath/gif");

输出图像: p_w_picpathgif()/p_w_picpathpng()/p_w_picpathjpeg()/....                                                 以GIF/png/jpeg 格式将图像输出到浏览器或文件

**************************************************

其它可选用函数:

随机函数

1、rand随机函数

rand([int min, int max]),如果不带参数,默认为0—1之间的随意数

2、十进制转换为十六进制函数

dechex(十进制数)

图像函数

1、p_w_picpathline 画线函数

bool p_w_picpathline ( resource $p_w_picpath, int $x1, int $y1, int $x2, int $y2, int $color)

参数说明:用color 颜色在图像 p_w_picpath 中从坐标 x1,y1 到 x2,y2(图像左上角为0,0)画一   条线段。

2、p_w_picpathsetpixel画点函数

bool p_w_picpathsetpixel ( resource $p_w_picpath , int $x , int $y , int $color )

参数说明:在 p_w_picpath 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点

字符串转换处理函数

php 验证码插入中文的方法

iconv("gb232","UTF-8",string text) 将字符串 text 编码有gb2312转换为 UTF-8

注意:先使用iconv转换字符编码,再将p_w_picpathttftext 转换好的utf-8格式的中文写入图片

p_w_picpathttftext 函数调用TrueType 字体向图像写入文本

p_w_picpathttftext带字体的写入函数

array p_w_picpathttftext(resource $p_w_picpath, float $size, float $angle, int $x, int $y, int $color, string $fontfile, string $text )

参数说明:调用的图片模板句柄,文本大小、字体的倾斜度、字体相对图片模板的左下角坐标位置、字体编码类型、即将插入的文本

angle:

角度制表示的角度,0度为从左向右读的文本。更高数值表示逆时针

旋转。例如 90 度表示从下向上读的文本

x:

由 x,y所表示的坐标定义了第一个字符的基本点(大概是字符的

左下角)。这和 p_w_picpathstring() 不同,其 x,y 定义了第一个字符

的左上角。例如 "top left" 为 0, 0

y:

Y 坐标。它设定了字体基线的位置,不是字符的最底端。

到此,总结完成啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值