<?php
/*
* Captcha Class base on PHP GD Lib
* @author Design
* @version 1.0
* @copyright http://www.hzhuti.com/nokia/n97/ 2010
* @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-&gt;textNum=4;
$this-&gt;fontSize=16;
$this-&gt;fontFamily='c:\windows\fontsSIMYOU.ttf';//设置中文字体,可以改成linux的目录
$this-&gt;textLang='en';
$this-&gt;noisePoint=30;
$this-&gt;noiseLine=3;
$this-&gt;distortion=false;
$this-&gt;showBorder=false;
}

//@设置图片宽度
public function setWidth($w){
$this-&gt;;
}
//@设置图片高度
public function setHeight($h){
$this-&gt;height=$h;
}
//@设置字符个数
public function setTextNumber($textN){
$this-&gt;textNum=$textN;
}
//@设置字符颜色
public function setFontColor($fc){
$this-&gt;fontColor=sscanf($fc,'#%2x%2x%2x');
}
//@设置字号
public function setFontSize($n){
$this-&gt;fontSize=$n;
}
//@设置字体
public function setFontFamily($ffUrl){
$this-&gt;fontFamily=$ffUrl;
}
//@设置字符语言
public function setTextLang($lang){
$this-&gt;textLang=$lang;
}
//@设置图片背景
public function setBgColor($bc){
$this-&gt;bgColor=sscanf($bc,'#%2x%2x%2x');
}
//@设置干扰点数量
public function setNoisePoint($n){
$this-&gt;noisePoint=$n;
}
//@设置干扰线数量
public function setNoiseLine($n){
$this-&gt;noiseLine=$n;
}
//@设置是否扭曲
public function setDistortion($b){
$this-&gt;distortion=$b;
}
//@设置是否显示边框
public function setShowBorder($border){
$this-&gt;showBorder=$border;
}
//@初始化验证码图片
public function initImage(){
if(empty($this-&gt;width)){$this-&gt;;gt;fontSize*1.3)*$this-&gt;textNum+10;}
if(empty($this-&gt;height)){$this-&gt;height=$this-&gt;fontSize*2;}
$this-&gt;image=imagecreatetruecolor($this-&gt;width,$this-&gt;height);
if(empty($this-&gt;bgColor)){
$this-&gt;randBgColor=imagecolorallocate($this-&gt;image,mt_rand(100,255),mt_rand(100,255),mt_rand(100,255));
}else{
$this-&gt;randBgColor=imagecolorallocate($this-&gt;image,$this-&gt;bgColor[0],$this-&gt;bgColor[1],$this-&gt;bgColor[2]);
}
imagefill($this-&gt;image,0,0,$this-&gt;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-&gt;randText($this-&gt;textLang));
$this-&gt;textContent=join('',$textArray);
if(empty($this-&gt;fontColor)){
$this-&gt;randFontColor=imagecolorallocate($this-&gt;image,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));
}else{
$this-&gt;randFontColor=imagecolorallocate($this-&gt;image,$this-&gt;fontColor[0],$this-&gt;fontColor[1],$this-&gt;fontColor[2]);
}
for($i=0;$i<$this->textNum;$i++){
$angle=mt_rand(-1,1)*mt_rand(1,20);
imagettftext($this-&gt;image,$this-&gt;fontSize,$angle,5+$i*floor($this-&gt;fontSize*1.3),floor($this-&gt;height*0.75),$this-&gt;randFontColor,$this-&gt;fontFamily,$textArray[$i]);
}
}
//@生成干扰点
public function createNoisePoint(){
for($i=0;$i<$this->noisePoint;$i++){
$pointColor=imagecolorallocate($this-&gt;image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
imagesetpixel($this-&gt;image,mt_rand(0,$this-&gt;width),mt_rand(0,$this-&gt;height),$pointColor);
}
}
//@产生干扰线
public function createNoiseLine(){
for($i=0;$i<$this->noiseLine;$i++) {
$lineColor=imagecolorallocate($this-&gt;image,mt_rand(0,255),mt_rand(0,255),20);
imageline($this-&gt;image,0,mt_rand(0,$this-&gt;width),$this-&gt;width,mt_rand(0,$this-&gt;height),$lineColor);
}
}
//@扭曲文字
public function distortionText(){
$this-&gt;distortionImage=imagecreatetruecolor($this-&gt;width,$this-&gt;height);
imagefill($this-&gt;distortionImage,0,0,$this-&gt;randBgColor);
for($x=0;$x<$this->width;$x++){
for($y=0;$y<$this->height;$y++){
$rgbColor=imagecolorat($this-&gt;image,$x,$y);
imagesetpixel($this-&gt;distortionImage,(int)($x+sin($y/$this-&gt;height*2*M_PI-M_PI*0.5)*3),$y,$rgbColor);
}
}
$this-&gt;image=$this-&gt;distortionImage;
}
//@生成验证码图片
public function createImage(){
$this-&gt;initImage(); //创建基本图片
$this-&gt;createText(); //输出验证码字符
if($this-&gt;distortion){$this-&gt;distortionText();} //扭曲文字
$this-&gt;createNoisePoint(); //产生干扰点
$this-&gt;createNoiseLine(); //产生干扰线
if($this-&gt;showBorder){imagerectangle($this-&gt;image,0,0,$this-&gt;width-1,$this-&gt;height-1,$this-&gt;randFontColor);} //添加边框
imagepng($this-&gt;image);
imagedestroy($this-&gt;image);
if($this-&gt;distortion){imagedestroy($this-&gt;$distortionImage);}
return $this-&gt;textContent;
}
}
?&gt;使用方法:

<?php
//session_start();
header("Content-type:image/png");
include('captcha5_class.php');
$captcha5=new Captcha();
//@设置验证码宽度
//$captcha5->setWidth(200);
//@设置验证码高度
//$captcha5-&gt;setHeight(50);
//@设置字符个数
$captcha5-&gt;setTextNumber(5);
//@设置字符颜色
//$captcha5-&gt;setFontColor('#ff9900');
//@设置字号大小
//$captcha5-&gt;setFontSize(25);
//@设置字体
$captcha5-&gt;setFontFamily('c:\windows\fonts\STXINGKA.TTF');
//@设置语言
$captcha5-&gt;setTextLang('cn');
//@设置背景颜色
//$captcha5-&gt;setBgColor('#000000');
//@设置干扰点数量
//$captcha5-&gt;setNoisePoint(600);
//@设置干扰线数量
//$captcha5-&gt;setNoiseLine(10);
//@设置是否扭曲
//$captcha5-&gt;setDistortion(true);
//@设置是否显示边框
$captcha5-&gt;setShowBorder(true);
//输出验证码
$code=$captcha5-&gt;createImage();
//$_SESSION['captchaCode']['content']=$code;
//$_SESSION['captchaCode']['time']=microtime();
?&gt;

更多详细内容请查看:http://www.111cn.net/phper/phpanqn/42068.htm