php生成图形验证码几种方法小结


Posted in PHP onAugust 15, 2013

我们先来检查一下自己的php是不是打开了gd库。

<?php
if(extension_loaded('gd')) {
  echo '你可以使用gd<br>';
  foreach(gd_info() as $cate=>$value)
    echo "$cate: $value<br>";
}else
  echo '你没有安装gd扩展';
?>

如果有返回信息就正确可以常用使用了
例1
<?php
/**
 * vCode(m,n,x,y) m个数字  显示大小为n   边宽x   边高y
 * 自己改写记录session $code
 */
session_start(); 
vCode(4, 15); //4个数字,显示大小为15
function vCode($num = 4, $size = 20, $width = 0, $height = 0) {
 !$width && $width = $num * $size * 4 / 5 + 5;
 !$height && $height = $size + 10; 
 // 去掉了 0 1 O l 等
 $str = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVW";
 $code = '';
 for ($i = 0; $i < $num; $i++) {
  $code .= $str[mt_rand(0, strlen($str)-1)];
 } 
 // 画图像
 $im = imagecreatetruecolor($width, $height); 
 // 定义要用到的颜色
 $back_color = imagecolorallocate($im, 235, 236, 237);
 $boer_color = imagecolorallocate($im, 118, 151, 199);
 $text_color = imagecolorallocate($im, mt_rand(0, 200), mt_rand(0, 120), mt_rand(0, 120)); 
 // 画背景
 imagefilledrectangle($im, 0, 0, $width, $height, $back_color); 
 // 画边框
 imagerectangle($im, 0, 0, $width-1, $height-1, $boer_color); 
 // 画干扰线
 for($i = 0;$i < 5;$i++) {
  $font_color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
  imagearc($im, mt_rand(- $width, $width), mt_rand(- $height, $height), mt_rand(30, $width * 2), mt_rand(20, $height * 2), mt_rand(0, 360), mt_rand(0, 360), $font_color);
 } 
 // 画干扰点
 for($i = 0;$i < 50;$i++) {
  $font_color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
  imagesetpixel($im, mt_rand(0, $width), mt_rand(0, $height), $font_color);
 } 
 // 画验证码
 @imagefttext($im, $size , 0, 5, $size + 3, $text_color, 'c:\WINDOWS\Fonts\simsun.ttc', $code);
 $_SESSION["VerifyCode"]=$code; 
 header("Cache-Control: max-age=1, s-maxage=1, no-cache, must-revalidate");
 header("Content-type: image/png;charset=gb2312");
 imagepng($im);
 imagedestroy($im);
}
?>

例2
使用PHP,结合session和GD库扩展开发的一个生成验证码的例子(w3c推荐),可以很方便的用于项目中。而且样式美观
//首先开启session
session_start();
//定义前台显示验证码长&宽
$image_width = 120;
$image_height = 40;
$characters_on_image = 6;
$font = './monofont.ttf';
//The characters that can be used in the CAPTCHA code.
//avoid confusing characters (l 1 and i for example)
$possible_letters = '23456789bcdfghjkmnpqrstvwxyz';
$random_dots = 10;
$random_lines = 30;
$captcha_text_color="0x142864";
$captcha_noice_color = "0x142864";
//定义要生成验证码的字符串
$code = '';
$i = 0;
while ($i < $characters_on_image) {
$code .= substr($possible_letters, mt_rand(0, strlen($possible_letters)-1), 1);
$i++;
}
$font_size = $image_height * 0.75;
$image = @imagecreate($image_width, $image_height);
/* setting the background, text and noise colours here */
$background_color = imagecolorallocate($image, 255, 255, 255);
$arr_text_color = hexrgb($captcha_text_color);
$text_color = imagecolorallocate($image, $arr_text_color['red'],
        $arr_text_color['green'], $arr_text_color['blue']);
$arr_noice_color = hexrgb($captcha_noice_color);
$image_noise_color = imagecolorallocate($image, $arr_noice_color['red'],
        $arr_noice_color['green'], $arr_noice_color['blue']);
/* generating the dots randomly in background */
for( $i=0; $i<$random_dots; $i++ ) {
imagefilledellipse($image, mt_rand(0,$image_width),
 mt_rand(0,$image_height), 2, 3, $image_noise_color);
}
/* generating lines randomly in background of image */
for( $i=0; $i<$random_lines; $i++ ) {
imageline($image, mt_rand(0,$image_width), mt_rand(0,$image_height),
 mt_rand(0,$image_width), mt_rand(0,$image_height), $image_noise_color);
}
/* create a text box and add 6 letters code in it */
$textbox = imagettfbbox($font_size, 0, $font, $code);
$x = ($image_width - $textbox[4])/2;
$y = ($image_height - $textbox[5])/2;
imagettftext($image, $font_size, 0, $x, $y, $text_color, $font , $code);
/* Show captcha image in the page html page */
header('Content-Type: image/jpeg');// defining the image type to be shown in browser widow
imagejpeg($image);//showing the image
imagedestroy($image);//destroying the image instance
//设置session,做验证
$_SESSION['6_letters_code'] = $code;
function hexrgb ($hexstr)
{
  $int = hexdec($hexstr);
  return array("red" => 0xFF & ($int >> 0x10),
               "green" => 0xFF & ($int >> 0x8),
               "blue" => 0xFF & $int);
}

个人推荐推荐第二个生成验证码程序代码,各位同学可尝试参考对比哦,最后一个是W3C标准生成的也是利用了php gd库。
PHP 相关文章推荐
一个PHP+MSSQL分页的例子
Oct 09 PHP
让你同时上传 1000 个文件 (一)
Oct 09 PHP
PHP 判断常量,变量和函数是否存在
Apr 26 PHP
php下将XML转换为数组
Jan 01 PHP
PHP之COOKIE支持详解
Sep 20 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
Dec 29 PHP
解析php中session的实现原理以及大网站应用应注意的问题
Jun 17 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
php判断电子邮件是否正确方法
Dec 04 PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 PHP
PHP中将ip地址转成十进制数的两种实用方法
Aug 15 #PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
Aug 15 #PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
Aug 13 #PHP
php使用sql数据库 获取字段问题介绍
Aug 12 #PHP
完美解决PHP中的Cannot modify header information 问题
Aug 12 #PHP
php 下载保存文件保存到本地的两种实现方法
Aug 12 #PHP
CodeIgniter上传图片成功的全部过程分享
Aug 12 #PHP
You might like
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
php中++i 与 i++ 的区别
2012/08/08 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
Javascript 类与静态类的实现
2010/04/01 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
js实现文本框选中的方法
2015/05/26 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
python实现备份目录的方法
2015/08/03 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
Python常见数据类型转换操作示例
2019/05/08 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
韩国11街:11STREET
2018/03/27 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
教师自荐信
2013/12/10 职场文书
先进党支部事迹材料
2014/01/13 职场文书
商场客服专员岗位职责
2014/06/13 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
公路施工安全责任书
2015/05/08 职场文书
公司开业主持词
2015/07/02 职场文书
高中生军训感言
2015/08/01 职场文书
MySQL分区表管理命令汇总
2022/03/21 MySQL
Github 使用python对copilot做些简单使用测试
2022/04/14 Python