-
header("content-type:text/html;charset=utf-8");代表浏览器输出文本类型查看全部
-
多看php官方文档查看全部
-
底图默认为黑色查看全部
-
0-120区间为深色查看全部
-
对于资源型数据用完要销毁,比如用gd库创建的底图查看全部
-
技术点、难点分析: 技术点: 1)底图的实现,并且添加干扰元素:依赖PHP图片处理库GD,详细查看:http://php.net/gd 2)生成验证内容:简单的随机数生成,使用PHP函数mt_rand();随机数字+字幕生成,需要ASCⅡ码理论基础; 随机中文内容生成,需要UTF-8编码理论基础 3)验证内容保存在服务端:需要PHP操作SESSION基础 4)验证内容的校验:需要前端Ajax基础查看全部
-
步骤: 1.验证码底图 2.验证码内容:生成无规律内容 3.生成验证码 4.对比校验查看全部
-
session_start(); header('content-type:text/html;charset=utf-8'); // 定义字符集路径 $fontface = "SIMYOU.TTF"; // 定义字符库 $str = "中文字库"; // 如果字符必须保证为 UTF-8 编码格式, 如果不是,需要将其转换UTF-8 编码 // iconv ( string $in_charset , string $out_charset , string $str ) 将 $in_charset 编码的 $str 字符串按要求的 $out_charset 字符编码来转换 并返回 // $str = iconv("GBK", "UTF-8", $text); // 将字符库中的字符截取成数组 // str_split(string,length) 把字符串分割到数组中。string 要分割的字符串。length 每个数组元素的长度。默认是 1。 // 因为 utf-8 编码的字符 是三个字节一个汉字,所以 length = 3. $strdb = str_split($str,3); for ($i=0; $i < 4; $i++) { // 0-120 为深色区,能更好的在浅色背景中识别验证码 $fontcolor = imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120)); $index = rand(0,count($strdb)-1); $cn = $strdb[$index]; $captch .=$cn; // imagettftext ( 画布资源 , 字体大小 , 倾斜角度 , X轴位置 , Y轴位置 , 字体颜色 , 字符集路径 , 文字内容 ) 图像写入文本 imagettftext($image, rand(14,18), mt_rand(-60,60), (40*$i+20), mt_rand(30,35), $fontcolor, $fontface, $cn); } // 保存验证码,并全部转换在小写 $_SESSION['authcode'] = strtolower($captch);查看全部
-
在form_xxx.php 中 或者将 php代码 包含到 <body> 中,或者在 php代码最前面加上 header('content-type:text/html;charset=utf-8'); 这样浏览器才能正确处理 $_SESSION['authcode'] 和 $_REQUEST['authcode']中可能出现的汉字 captch_img.php 中的代码: session_start(); //开启 session 功能 $table = array( //制作 验证图 验证码 对照表 'pic0'=>'猫', 'pic1'=>'狗', 'pic2'=>'蛇', 'pic3'=>'马' ); $index = rand(0,3); //生成随机数 $value = $table['pic'.$index]; //获取对应验证码 $_SESSION['authcode'] = $value; //保存验证码 $filename = dirname(__FILE__).'\\pic'.$index.'.jpg'; //获取验证图文件路径 $contents = file_get_contents($filename); //获取验证图内容 header('content-type:image/jpg'); //填写报头 echo $contents; //输出验证图查看全部
-
<form method="post" action="./form.php"> <p> 验证码图片: <!-- 这里在 src 中添加一个随机数,是为了在使用 "换一个" 功能时,浏览器会以为 src 与之前的有所不同 而重新从服务器下载图片,否则浏览器会直接调用缓存中的 图片 或者甚至 不做任何动作 --> <img id="captcha_img" border="1" src="./captcha.php?r=<?php echo rand();?>" width:100px; height:30px/> <a href="javascript:void(0)" onclick="document.getElementById('captcha_img').src='./captcha.php?r='+Math.random()">换一个</a> </p> <p>请输入图片中的内容:<input type="text" name="authcode" value="" /></p> <p><input type="submit" value="提交" ></p> </form>查看全部
-
// 必须保证 session_start() 前,没有任何向浏览器的输出(不能有 HTML 代码,不能有 echo print var_dump 等等) // 要在 php 脚本中使用 $_SESSION ,脚本中必须包含 session_start() session_start(); // 用于保存生成的验证码 $captch =""; for ($i=0; $i < 4; $i++) { $fontsize = 6; // 0-120 为深色区,能更好的在浅色背景中识别验证码 $fontcolor = imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120)); // 制作字典 并去除容易混淆的字符(l 与 1, z 与 2,等等) $data = 'abcdefghijkmnqprstuvwxy3456789ABCDEFGHIJKLMNQPRSTUVWXY'; // 通过截取字符串内容方法,获得随机字符 $fontcontent = substr($data, rand(0,strlen($data)),1); $captch. = $fontcontent; // 生成的验证内容不重叠 $x = ($i*100/4) + rand(5,10); // 生成的验证内容不齐平 $y = rand(5,10); // 用 $fontcolor 颜色将字符串 $fontcontent 画到 $image 所代表的图像的 $x,$y 坐标处 imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor); } // 保存验证码,并全部转换在小写 $_SESSION['authcode'] = strtolower($captch);查看全部
-
// 数字+字母验证码 for ($i=0; $i < 4; $i++) { $fontsize = 6; // 0-120 为深色区,能更好的在浅色背景中识别验证码 $fontcolor = imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120)); // 制作字典 并去除容易混淆的字符(l 与 1, z 与 2,等等) $data = 'abcdefghijkmnqprstuvwxy3456789'; // 通过截取字符串内容方法,获得随机字符 $fontcontent = substr($data, rand(0,strlen($data)),1); // 生成的验证内容不重叠 $x = ($i*100/4) + rand(5,10); // 生成的验证内容不齐平 $y = rand(5,10); // 用 $fontcolor 颜色将字符串 $fontcontent 画到 $image 所代表的图像的 $x,$y 坐标处 imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor); }查看全部
-
for ($i=0; $i < 3; $i++) { // 颜色设置为 80-220 ,是为了使 线 与 点 与 验证码 更好的区分 $linecolor = imagecolorallocate($image, rand(80,220), rand(80,220), rand(80,220)); // imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ) // imageline() 用 color 颜色在图像 image 中从坐标 x1,y1 到 x2,y2 画一条线段。 imageline($image, rand(1,99), rand(1,29), rand(1,99), rand(1,29), $linecolor) } PS: 干扰元素一定要控制好颜色,使之不影响用户识别验证码查看全部
-
for($i=0;$i<4;$i++){ $fontsize = 6; // 0-120 为深色区,能更好的在浅色背景中识别验证码 $fontcolor = imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120)); $fontcontent = rand(0,9); // 生成的验证内容不重叠 $x = ($i*100/4) + rand(5,10); // 生成的验证内容不齐平 $y = rand(5,10); // 用 $fontcolor 颜色将字符串 $fontcontent 画到 $image 所代表的图像的 $x,$y 坐标处 imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor); } for ($i=0; $i < 200; $i++) { // 50-200 为浅色区,使用户能更好的区分 干扰 与 验证码 $pointcolor = imagecolorallocate($image, rand(50,200), rand(50,200), rand(50,200)); // 在 $image 图像中用 $pointcolor 颜色在 $x,$y 坐标上画一个点。 imagesetpixel($image, rand(1,99), rand(1,29), $pointcolor); }查看全部
-
程序解析: 1.创建黑色画布 $image = imagecreate(100, 30); 2.为画布定义(背景)颜色 $bgcolor = imagecolorallocate($image, 255, 255, 255); 3.填充颜色 imagefill($image, 0, 0, $bgcolor); 4.向浏览器输出图片头信息 header('content-type:image/png'); 5.输出图片到浏览器 imagepng($image); 6.销毁图片 imagedestroy($image); 注意事项: 1.依赖gd扩展. 2.输出图片前必须提前输出图片的header信息. 3. imagecreatetruecolor( int $width, int $height ) 默认输出为黑色背景.查看全部
举报
0/150
提交
取消