支持中文字母数字、自定义字体php验证码代码


Posted in PHP onFebruary 27, 2012
<?php 
/* 
* Captcha Class base on PHP GD Lib 
* @author Design 
* @version 1.0 
* @demo 
* include('captchaClass.php'); 
* $captchaDemo=new Captcha(); 
* $captchaDemo->createImage(); 
*/ 
class Captcha{ 
//@定义验证码图片高度 
private $height; 
//@定义验证码图片宽度 
private $width; 
//@定义验证码字符个数 
private $textNum; 
//@定义验证码字符内容 
private $textContent; 
//@定义字符颜色 
private $fontColor; 
//@定义随机出的文字颜色 
private $randFontColor; 
//@定义字体大小 
private $fontSize; 
//@定义字体 
private $fontFamily; 
//@定义背景颜色 
private $bgColor; 
//@定义随机出的背景颜色 
private $randBgColor; 
//@定义字符语言 
private $textLang; 
//@定义干扰点数量 
private $noisePoint; 
//@定义干扰线数量 
private $noiseLine; 
//@定义是否扭曲 
private $distortion; 
//@定义扭曲图片源 
private $distortionImage; 
//@定义是否有边框 
private $showBorder; 
//@定义验证码图片源 
private $image; //@Constructor 构造函数 
public function Captcha(){ 
$this->textNum=4; 
$this->fontSize=16; 
$this->fontFamily='c:\windows\fontsSIMYOU.ttf';//设置中文字体,可以改成linux的目录 
$this->textLang='en'; 
$this->noisePoint=30; 
$this->noiseLine=3; 
$this->distortion=false; 
$this->showBorder=false; 
} 

//@设置图片宽度 
public function setWidth($w){ 
$this->width=$w; 
} 
//@设置图片高度 
public function setHeight($h){ 
$this->height=$h; 
} 
//@设置字符个数 
public function setTextNumber($textN){ 
$this->textNum=$textN; 
} 
//@设置字符颜色 
public function setFontColor($fc){ 
$this->fontColor=sscanf($fc,'#%2x%2x%2x'); 
} 
//@设置字号 
public function setFontSize($n){ 
$this->fontSize=$n; 
} 
//@设置字体 
public function setFontFamily($ffUrl){ 
$this->fontFamily=$ffUrl; 
} 
//@设置字符语言 
public function setTextLang($lang){ 
$this->textLang=$lang; 
} 
//@设置图片背景 
public function setBgColor($bc){ 
$this->bgColor=sscanf($bc,'#%2x%2x%2x'); 
} 
//@设置干扰点数量 
public function setNoisePoint($n){ 
$this->noisePoint=$n; 
} 
//@设置干扰线数量 
public function setNoiseLine($n){ 
$this->noiseLine=$n; 
} 
//@设置是否扭曲 
public function setDistortion($b){ 
$this->distortion=$b; 
} 
//@设置是否显示边框 
public function setShowBorder($border){ 
$this->showBorder=$border; 
} 
//@初始化验证码图片 
public function initImage(){ 
if(empty($this->width)){$this->width=floor($this->fontSize*1.3)*$this->textNum+10;} 
if(empty($this->height)){$this->height=$this->fontSize*2;} 
$this->image=imagecreatetruecolor($this->width,$this->height); 
if(empty($this->bgColor)){ 
$this->randBgColor=imagecolorallocate($this->image,mt_rand(100,255),mt_rand(100,255),mt_rand(100,255)); 
}else{ 
$this->randBgColor=imagecolorallocate($this->image,$this->bgColor[0],$this->bgColor[1],$this->bgColor[2]); 
} 
imagefill($this->image,0,0,$this->randBgColor); 
} 
//@产生随机字符 
public function randText($type){ 
$string=''; 
switch($type){ 
case 'en': 
$str='ABCDEFGHJKLMNPQRSTUVWXY3456789'; 
for($i=0;$i<$this->textNum;$i++){ 
$string=$string.','.$str[mt_rand(0,29)]; 
} 
break; 
case 'cn': 
for($i=0;$i<$this->textNum;$i++) { 
$string=$string.','.chr(rand(0xB0,0xCC)).chr(rand(0xA1,0xBB)); 
} 
$string=iconv('GB2312','UTF-8',$string); //转换编码到utf8 
break; 
} 
return substr($string,1); 
} 
//@输出文字到验证码 
public function createText(){ 
$textArray=explode(',',$this->randText($this->textLang)); 
$this->textContent=join('',$textArray); 
if(empty($this->fontColor)){ 
$this->randFontColor=imagecolorallocate($this->image,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100)); 
}else{ 
$this->randFontColor=imagecolorallocate($this->image,$this->fontColor[0],$this->fontColor[1],$this->fontColor[2]); 
} 
for($i=0;$i<$this->textNum;$i++){ 
$angle=mt_rand(-1,1)*mt_rand(1,20); 
imagettftext($this->image,$this->fontSize,$angle,5+$i*floor($this->fontSize*1.3),floor($this->height*0.75),$this->randFontColor,$this->fontFamily,$textArray[$i]); 
} 
} 
//@生成干扰点 
public function createNoisePoint(){ 
for($i=0;$i<$this->noisePoint;$i++){ 
$pointColor=imagecolorallocate($this->image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); 
imagesetpixel($this->image,mt_rand(0,$this->width),mt_rand(0,$this->height),$pointColor); 
} 
} 
//@产生干扰线 
public function createNoiseLine(){ 
for($i=0;$i<$this->noiseLine;$i++) { 
$lineColor=imagecolorallocate($this->image,mt_rand(0,255),mt_rand(0,255),20); 
imageline($this->image,0,mt_rand(0,$this->width),$this->width,mt_rand(0,$this->height),$lineColor); 
} 
} 
//@扭曲文字 
public function distortionText(){ 
$this->distortionImage=imagecreatetruecolor($this->width,$this->height); 
imagefill($this->distortionImage,0,0,$this->randBgColor); 
for($x=0;$x<$this->width;$x++){ 
for($y=0;$y<$this->height;$y++){ 
$rgbColor=imagecolorat($this->image,$x,$y); 
imagesetpixel($this->distortionImage,(int)($x+sin($y/$this->height*2*M_PI-M_PI*0.5)*3),$y,$rgbColor); 
} 
} 
$this->image=$this->distortionImage; 
} 
//@生成验证码图片 
public function createImage(){ 
$this->initImage(); //创建基本图片 
$this->createText(); //输出验证码字符 
if($this->distortion){$this->distortionText();} //扭曲文字 
$this->createNoisePoint(); //产生干扰点 
$this->createNoiseLine(); //产生干扰线 
if($this->showBorder){imagerectangle($this->image,0,0,$this->width-1,$this->height-1,$this->randFontColor);} //添加边框 
imagepng($this->image); 
imagedestroy($this->image); 
if($this->distortion){imagedestroy($this->$distortionImage);} 
return $this->textContent; 
} 
} 
?>使用方法: 
<?php 
//session_start(); 
header("Content-type:image/png"); 
include('captcha5_class.php'); 
$captcha5=new Captcha(); 
//@设置验证码宽度 
//$captcha5->setWidth(200); 
//@设置验证码高度 
//$captcha5->setHeight(50); 
//@设置字符个数 
$captcha5->setTextNumber(5); 
//@设置字符颜色 
//$captcha5->setFontColor('#ff9900'); 
//@设置字号大小 
//$captcha5->setFontSize(25); 
//@设置字体 
$captcha5->setFontFamily('c:\windows\fonts\STXINGKA.TTF'); 
//@设置语言 
$captcha5->setTextLang('cn'); 
//@设置背景颜色 
//$captcha5->setBgColor('#000000'); 
//@设置干扰点数量 
//$captcha5->setNoisePoint(600); 
//@设置干扰线数量 
//$captcha5->setNoiseLine(10); 
//@设置是否扭曲 
//$captcha5->setDistortion(true); 
//@设置是否显示边框 
$captcha5->setShowBorder(true); 
//输出验证码 
$code=$captcha5->createImage(); 
//$_SESSION['captchaCode']['content']=$code; 
//$_SESSION['captchaCode']['time']=microtime(); 
?>
PHP 相关文章推荐
坏狼php学习 计数器实例代码
Jun 15 PHP
PHP 导出数据到淘宝助手CSV的方法分享
Feb 27 PHP
在MongoDB中模拟Auto Increment的php代码
Mar 06 PHP
Linux编译升级php的详细方法
Nov 04 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
[原创]php简单隔行变色功能实现代码
Jul 09 PHP
php使用正则表达式获取字符串中的URL
Dec 29 PHP
PHP笛卡尔积实现算法示例
Jul 30 PHP
PHP filesize函数用法浅析
Feb 15 PHP
java解析json方法总结
May 16 PHP
关于laravel 日志写入失败问题汇总
Oct 17 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 PHP
一些需要禁用的PHP危险函数(disable_functions)
Feb 23 #PHP
PHP面向对象法则
Feb 23 #PHP
优化PHP程序的方法小结
Feb 23 #PHP
数据库中排序的对比及使用条件详解
Feb 23 #PHP
PHP中几个常用的魔术常量
Feb 23 #PHP
PHP教程之PHP中shell脚本的使用方法分享
Feb 23 #PHP
php tp验证表单与自动填充函数代码
Feb 22 #PHP
You might like
多文件上传的例子
2006/10/09 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
jquery 弹出层实现代码
2009/10/30 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
python动态加载变量示例分享
2014/02/17 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
Python命令行解析模块详解
2018/02/01 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
什么是索引指示器
2012/08/20 面试题
爱心捐书活动总结
2014/07/05 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL