验证码图片 程序
/*
*文件名:class.safeCode.php
*类名:safeCode
*目的:生成web应用时所需的验证码图片
*当前版本:1.0.2
*作者:NoAngels
*联系方式:[email protected] QQ:82535599 MSN:[email protected]
*开发时间:2008年06月20日
*最后更新:2008年06月21日
*更新内容:
*版本1.0.2
*1.更新了对linux主机支持,设置GDFONTPATH环境变量,
* putenv('GDFONTPATH=' . realpath('.'));
*2.对不支持antialias函数的时候避免采用此方法,避免低版本的GD库
*版本1.0.1
*1.更新了绘制指定类型图片,支持类型有:png,jpeg,gif.默认为png(此效果最佳)
*2.优化了部分代码
*/
class safeCode{
function __construct(){
#设置默认safe安全保护码
$this->__safe = substr(md5(time()), 0 , 4);
}
function __destruct(){
#释放资源
unset($this->__img, $this->__canvasWidth, $this->__canvasHeight, $this->__codeLength, $this->__spacePerChar, $this->__code, $this->__safe, $this->__background, $this->__borderColor, $this->__colors, $this->__font, $this->__sessionName);
}
function setCanvas($, $){
#设置画布宽度以及高度.有默认值
$this->__canvasWidth = $width;
$this->__canvasHeight = $height;
$this->__img = imagecreatetruecolor($width, $height);
return;
}
function setSafe($char){
#设置安全码,不调用系统会自己设置
$this->__safe = $char;
return;
}
function setCodeLength($num = 8){
#设置验证码长度
$this->__codeLength = $num;
}
function setFont($fontName){
#设置绘图时所用的字体,字体文件必须与类文件同目录
$this->__font = $fontName;
return;
}
function setBackground($arg1 = 255, $arg2 = 255, $arg3 = 255){
#设置背景颜色
$this->__background = imagecolorallocate($this->__img, $arg1, $arg2, $arg3);
return;
}
function setBorderColor($arg1 = 128, $arg2 = 128, $arg3 = 128){
#设置边框颜色
$this->__borderColor = imagecolorallocate($this->__img, $arg1, $arg2, $arg3);
}
function setFontColor($arr){
#设置绘图时所用颜色,参数为颜色集合数组
foreach($arr as $color){
$this->__colors[] = imagecolorallocate($this->__img, $color[0], $color[1], $color[2]);
}
return;
}
function setSession($sessionName = 'safeCode'){
#设置session变量名,默认为$_SESSION['safeCode']
$this->__sessionName = $sessionName;
#$_SESSION[$sessionName] = $this->__code;
return;
}
function display($type = 'png'){
#显示图片,可指定显示类型,目前支持png(默认),jpeg,gif
$this->__setSpacePerChar();
imagefilledrectangle($this->__img, 1, 1, $this->__canvasWidth - 2, $this->__canvasHeight -2, $this->__background);
imagerectangle($this->__img, 0, 0, $this->__canvasWidth - 1, $this->__canvasHeight - 1, $this->__borderColor);
$this->__drawText($this->__colors, $this->__getCode(), $this->__font);
#修正linux以及低版本的GD库问题
if(function_exists(imageantialias)){
imageantialias($this->__img, true);
}
$_SESSION[$this->__sessionName] = $this->__code;
switch ($type){
case 'png':
header('Content-type:image/png');
imagepng($this->__img);
case 'jpeg':
header('Content-type:image/jpeg');
imagejpeg($this->__img, '' , 75);
case 'gif':
header('Content-type:image/gif');
imagegif($this->__img);
default:
header('Content-type:image/png');
imagepng($this->__img);
}
imagegif($this->__img);
}
private function __setSpacePerChar(){
#私有函数,设置字符间隔
$this->__spacePerChar = $this->__canvasWidth / $this->__codeLength;
return;
}
private function __getCode(){
#获取验证码
$this->__code = substr(md5(time().$this->__safe), rand(0, 24), $this->__codeLength);
return $this->__code;
}
private function __drawText($colors, $code, $fontName){
#开始绘图
#设置GBFONTPATH为当前目录,不然linux环境下会报错
putenv('GDFONTPATH=' . realpath('.'));
for($i = 0; $i < strlen($code); $i++){
$color = $colors[$i % count($colors)];
imagettftext(
$this->__img,
24 + rand(0, 8),
-20 + rand(0, 40),
($i + 0.3) * $this->__spacePerChar,
$this->__canvasHeight - 20 + rand(0, 20),
$color,
$fontName,
$code{$i}
);
}
#绘制随机实线
for($i = 0; $i < 400; $i++){
$x1 = rand(5, $this->__canvasWidth - 5);
$y1 = rand(5, $this->__canvasHeight - 5);
$x2 = $x1 - 4 + rand(0, 8);
$y2 = $y1 - 4 + rand(0, 8);
imageline($this->__img, $x1, $y1, $x2, $y2, $this->__colors[rand(0, count($this->__colors) - 1)]);
}
return;
}
private $__img = NULL;
private $__canvas;
private $__canvas;
private $__codeLength = 8;
private $__spacePerChar = 0;
private $__code = 12345678;
private $__safe = 2008;
private $__background = NULL;
private $__borderColor = NULL;
private $__colors = array();
private $__font = 'arial.ttf';
private $__sessionName = '';
}
?>
使用方法.
#测试文件
include_once('class.safeCode.php');
session_start();
$safeCode = new safeCode;
$safeCode->setCanvas(200, 50);
$safeCode->setCodeLength(8);
$safeCode->setSafe('2008');#设置安全码,不设置有默认值,动态生成
$safeCode->setBackground();
$safeCode->setBorderColor();
$safeCode->setFont('arial.ttf');#设置字体.必须同目录,字体文件
$colors = array(array(128, 64, 192), array(192, 64, 128), array(108, 192, 64));
$safeCode->setFontColor($colors);
$safeCode->setSession();
$safeCode->display('jpeg');
?>