前言
以前觉得图片验证码很神秘的,但是今天看了看网上的教程,发现并不是很难,PHP5具体实现如下。createphoto.php文件用来生成图片验证码,并通过session向test.php传递验证码内容;而test.php则在表单中引用生成的图片和验证用户的输入。
代码实现(PHP5)
<?php #createphoto.php #启用session session_start(); #生成4个随机字符 $ary = 'qwertyuiopasdfghjklzxcvbnm0123456789'; for ($i = 0; $i < 4; $i++) { $index = rand(0, 35); $rundstr .= $ary[$index]; } #把随机数保存到session $_SESSION[rundstr] = $rundstr; #图片尺寸 $x_size = 100; $y_size = 30; #新建一个真彩×××像 $img = p_w_picpathcreate($x_size, $y_size); #生成各种颜色 p_w_picpathcolorallocate($img, 230, 230, 230); #设置图片的背景色 $fontcolor = p_w_picpathcolorallocate($img, 0, 0, 0); #生成字体的颜色 $pointcolor = p_w_picpathcolorallocate($img, 0, 0, 0); #生成噪点的颜色 #添加200个噪点 for ($i = 0; $i < 200; $i++) { p_w_picpathsetpixel($img, rand(0, $x_size), rand(0, $y_size), $pointcolor); } //添加5条干扰线 for ($i = 0; $i < 5; $i++) { $linecolor = p_w_picpathcolorallocate($img, rand(0, 225), rand(0, 225), rand(0, 225)); #生成干扰线的颜色 p_w_picpathline($img, rand(0, 100), 0, rand(0, 100), rand(0, 30), $linecolor); } #绘图 p_w_picpathstring($img, 6, rand(0, 30), rand(5, 12), $rundstr, $fontcolor); //显示图片 header("Content_type:p_w_picpath/jpeg"); p_w_picpathjpeg($img); ?>
<?php #test.php #启动session session_start(); #验证 if ($_POST[inputvalue]) { if ($_POST[inputvalue] == $_SESSION[rundstr]) { echo "成功"; } else { echo "失败"; } } ?> <form action="" method="post"> <input type="text" name="inputvalue" size="20"></input> <img src="createphoto.php"></img></br> <input type="submit" name="submit" value="确定"></input> </form>
运行效果
访问test.php,输入6q94,点击确定;
说明
1、首先要启动gd库,可通过WampServer(PHP -> PHP扩展 -> php_gd2),或修改PHP.ini文件(去掉extension=php_gd2.dll前的";"号);
2、p_w_picpathcreate ( int x_size, int y_size ) // 创建图像,返回图像对象,x就是宽 ,y就是高;
3、p_w_picpathcolorallocate ( resource p_w_picpath, int red, int green, int blue ) // 第一次调用是为图像设置颜色,返回颜色的值;
4、p_w_picpathstring ( resource p_w_picpath, font, int x, int y, 内容 , 颜色 ) // 绘图;
5、rand( int x, int y ) // 生成随机数,范围[x , y]闭区间;
6、p_w_picpathsetpixel ( resource p_w_picpath, int x, int y, int color ) // 画点,xy是点在图像中的坐标;
7、p_w_picpathline ( resource p_w_picpath, int x1, int y1, int x2, int y2, int color ) // 画线,x1y1是起始点坐标,x2y2是终点坐标;
8、header("Content_type:p_w_picpath/jpeg") // 说明文件类型
9、p_w_picpathjpeg($img) // 显示图片