第一次写的验证码图片类!
时间:2008-01-03
来源:互联网
我是在看了vsfree大侠的验证码类后为了学习改写的类,只能算做是整理吧!有不对的地方还请大学多指点指点!
原贴:http://bbs.phpchina.com/post.php?action=newthread&fid=72&extra=page%3D2
[ 本帖最后由 Mpower 于 2008-1-2 17:46 编辑 ]
原贴:http://bbs.phpchina.com/post.php?action=newthread&fid=72&extra=page%3D2
复制PHP内容到剪贴板
<?php
/**
* @author Mpower
*
*/
class vCodeImg{
var $v_mode; //图片的模式
var $v_num; //验证码个数
var $img_w; //图片宽度
var $img_h; //图片高度
var $border; //是否显示边框
var $bordercolor; //边框的颜色
var $pix_num; //干扰像素的个数
var $line_num; //干扰线条的个数
var $fontDir; //字体存放的目录
/**
**@ 构造函数
*/
public function __construct($v_mode,$v_num,$img_w,$img_h,$pix_num,$line_num,$border,$bordercolor,$fontDir){
$this->v_mode=$v_mode;
$this->v_num=$v_num;
$this->img_w=$img_w;
$this->img_h=$img_h;
$this->bordercolor=$bordercolor;
$this->pix_num=$pix_num;
$this->line_num=$line_num;
$this->fontDir=$fontDir;
$this->border=$border;
}
/**
**生成验证码图片
*/
public function setVimage(){
session_start();
if(!isset($_SESSION['vCode'])){
session_register('vCode');
}
$_SESSION['vCode']='';
$im=imagecreate($this->img_w,$this->img_h);
$black=imagecolorallocate($im,0,0,0);
$white=imagecolorallocate($im,255,255,255);
$bgcolor=imagecolorallocate($im,250,250,250);
imagefill($im,0,0,$bgcolor);
if($this->border){
$this->drawBorder($im);
}
$outChar=$this->getRandChar();
$time = time();
$_SESSION['vCode']=$outChar."|".$time; //把验证码和生成时间负值给$_SESSION[vCode]
$charX=mt_rand(2,$this->img_w/$this->v_num+2); //初始化第一个字符的X坐标
for($i=0;$i<$this->v_num;$i++){
$size=mt_rand(intval($this->img_w/($this->v_num+1)),intval($this->img_w/$this->v_num));
$angle= mt_rand(-20,20);
if($this->border){
$charY=mt_rand(($size+3),($this->img_h-3)); //字符的Y轴坐标
}else{
$charY=mt_rand(($size+2),($this->img_h-2));
}
$fRandColor=$this->getRandColor(0,200,0,255,0,250);
$fColor=imagecolorallocate($im,$fRandColor[0],$fRandColor[1],$fRandColor[2]);
$font=$this->getFonts();
imagettftext($im,$size,$angle,$charX,$charY,$fColor,$font,$outChar[$i]);
$charX+=intval($this->img_w/$this->v_num+2);
}
$this->addPix($im);
$this->addLine($im);
imageantialias($im,true);
$this->outImg($im);
}
/**
**@得到验证码上输出的图片
***参数:1:只输出数字|2:只输出字母|3:数字个字母混合输出|默认为只输出字母
*/
private function getChar(){
switch($this->v_mode){
case 1:
$outChar='0123456789';
break;
case 2:
$outChar='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
case 3:
$outChar='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
default:
$outChar='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
}
return $outChar;
}
/**
**@获得随机颜色
**$rl:为红色最小值|$rm为红色最大值|$gl为绿色最小值|$gm为绿色最大值|$bl为蓝色最小值|$bm为蓝色最大值
*/
private function getRandColor($rl,$rm,$gl,$gm,$bl,$bm){
$r=mt_rand($rl,$rm);
$g=mt_rand($gl,$gm);
$b=mt_rand($bl,$bm);
return array($r,$g,$b);
}
/**
**@获得随机验证码
*/
private function getRandChar(){
$outChar=$this->getChar($this->mode);
$v_count=strlen($outChar)-1;
for($i=0;$i<$this->v_num;$i++){
$vi=mt_rand(0,$v_count);
$randChar.=$outChar[$vi];
}
return $randChar;
}
/**
**@产生干扰像素
***$im参数为图片
*/
private function addPix($im){
for($i=0;$i<$this->pix_num;$i++){
$rand_color=$this->getRandColor(50,250,0,250,50,250);
$pix_color=imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);
imagesetpixel($im,mt_rand()%$this->img_w,mt_rand()%$this->img_h,$pix_color);
}
}
/**
**@产生干扰线条
***$im参数为图片
*/
private function addLine($im){
for($i=0;$i<$this->line_num;$i++){
$rand_color=$this->getRandColor(50,250,0,250,50,250);
$lin_color=imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);
imageline($im,mt_rand(0,intval($this->img_w/3)),mt_rand(0,$this->img_h),mt_rand(0,intval($this->img_w)),intval(mt_rand(0,$this->img_h)),$lin_color);
}
}
/**
**边框的颜色
**$im为图像参数
*/
private function drawBorder($im){
if(preg_match("/^\d{1,3},\d{1,3},\d{1,3}$/",$this->bordercolor)){
$bcolor=explode(',',$this->bordercolor);
}
$lcolor=imagecolorallocate($im,$bcolor[0],$bcolor[1],$bcolor[2]);
//画边框的顺序为顺时针方向
imageline($im,0,0,$this->img_w,0,$lcolor);
imageline($im,$this->img_w-1,0,$this->img_w-1,$this->img_h,$lcolor);
imageline($im,0,$this->img_h-1,$this->img_w,$this->img_h-1,$lcolor);
imageline($im,0,0,0,$this->img_h-1,$lcolor);
}
/**
**@获得字体
**并随机返回其中一个随机的字体
*/
private function getFonts(){
$fontName=scandir($this->fontDir);
$fontNum=count($fontName)-2;
$font=mt_rand(2,($fontNum+2));
return "$this->fontDir/".$fontName[$font];
}
/**
**生成图像
*/
private function outImg($im){
if (function_exists("imagegif")) {
header ("Content-type: image/gif");
imagegif($im);
}
elseif (function_exists("imagepng")) {
header ("Content-type: image/png");
imagepng($im);
}
elseif (function_exists("imagejpeg")) {
header ("Content-type: image/jpeg");
imagejpeg($im, "", 80);
}
elseif (function_exists("imagewbmp")) {
header ("Content-type: image/vnd.wap.wbmp");
imagewbmp($im);
}
else
die("No Image Support On This Server !");
imagedestroy($im);
}
}
//初始设置
$v_mode=2; //图片的模式
$v_num=4; //验证码个数
$img_w=100; //图片宽度
$img_h=25; //图片高度
$border=1; //是否显示边框
$bordercolor='255,200,85'; //边框的颜色
$pix_num=50; //干扰像素的个数
$line_num=5; //干扰线条的个数
$f;
$test=new vCodeImg($v_mode,$v_num,$img_w,$img_h,$pix_num,$line_num,$border,$bordercolor,$fontDir);
$test->setVimage();
在页面中调用:
PHP代码:
<?php
/**
* @author Mpower
*
*/
class vCodeImg{
var $v_mode; //图片的模式
var $v_num; //验证码个数
var $img_w; //图片宽度
var $img_h; //图片高度
var $border; //是否显示边框
var $bordercolor; //边框的颜色
var $pix_num; //干扰像素的个数
var $line_num; //干扰线条的个数
var $fontDir; //字体存放的目录
/**
**@ 构造函数
*/
public function __construct($v_mode,$v_num,$img_w,$img_h,$pix_num,$line_num,$border,$bordercolor,$fontDir){
$this->v_mode=$v_mode;
$this->v_num=$v_num;
$this->img_w=$img_w;
$this->img_h=$img_h;
$this->bordercolor=$bordercolor;
$this->pix_num=$pix_num;
$this->line_num=$line_num;
$this->fontDir=$fontDir;
$this->border=$border;
}
/**
**生成验证码图片
*/
public function setVimage(){
session_start();
if(!isset($_SESSION['vCode'])){
session_register('vCode');
}
$_SESSION['vCode']='';
$im=imagecreate($this->img_w,$this->img_h);
$black=imagecolorallocate($im,0,0,0);
$white=imagecolorallocate($im,255,255,255);
$bgcolor=imagecolorallocate($im,250,250,250);
imagefill($im,0,0,$bgcolor);
if($this->border){
$this->drawBorder($im);
}
$outChar=$this->getRandChar();
$time = time();
$_SESSION['vCode']=$outChar."|".$time; //把验证码和生成时间负值给$_SESSION[vCode]
$charX=mt_rand(2,$this->img_w/$this->v_num+2); //初始化第一个字符的X坐标
for($i=0;$i<$this->v_num;$i++){
$size=mt_rand(intval($this->img_w/($this->v_num+1)),intval($this->img_w/$this->v_num));
$angle= mt_rand(-20,20);
if($this->border){
$charY=mt_rand(($size+3),($this->img_h-3)); //字符的Y轴坐标
}else{
$charY=mt_rand(($size+2),($this->img_h-2));
}
$fRandColor=$this->getRandColor(0,200,0,255,0,250);
$fColor=imagecolorallocate($im,$fRandColor[0],$fRandColor[1],$fRandColor[2]);
$font=$this->getFonts();
imagettftext($im,$size,$angle,$charX,$charY,$fColor,$font,$outChar[$i]);
$charX+=intval($this->img_w/$this->v_num+2);
}
$this->addPix($im);
$this->addLine($im);
imageantialias($im,true);
$this->outImg($im);
}
/**
**@得到验证码上输出的图片
***参数:1:只输出数字|2:只输出字母|3:数字个字母混合输出|默认为只输出字母
*/
private function getChar(){
switch($this->v_mode){
case 1:
$outChar='0123456789';
break;
case 2:
$outChar='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
case 3:
$outChar='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
default:
$outChar='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
}
return $outChar;
}
/**
**@获得随机颜色
**$rl:为红色最小值|$rm为红色最大值|$gl为绿色最小值|$gm为绿色最大值|$bl为蓝色最小值|$bm为蓝色最大值
*/
private function getRandColor($rl,$rm,$gl,$gm,$bl,$bm){
$r=mt_rand($rl,$rm);
$g=mt_rand($gl,$gm);
$b=mt_rand($bl,$bm);
return array($r,$g,$b);
}
/**
**@获得随机验证码
*/
private function getRandChar(){
$outChar=$this->getChar($this->mode);
$v_count=strlen($outChar)-1;
for($i=0;$i<$this->v_num;$i++){
$vi=mt_rand(0,$v_count);
$randChar.=$outChar[$vi];
}
return $randChar;
}
/**
**@产生干扰像素
***$im参数为图片
*/
private function addPix($im){
for($i=0;$i<$this->pix_num;$i++){
$rand_color=$this->getRandColor(50,250,0,250,50,250);
$pix_color=imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);
imagesetpixel($im,mt_rand()%$this->img_w,mt_rand()%$this->img_h,$pix_color);
}
}
/**
**@产生干扰线条
***$im参数为图片
*/
private function addLine($im){
for($i=0;$i<$this->line_num;$i++){
$rand_color=$this->getRandColor(50,250,0,250,50,250);
$lin_color=imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);
imageline($im,mt_rand(0,intval($this->img_w/3)),mt_rand(0,$this->img_h),mt_rand(0,intval($this->img_w)),intval(mt_rand(0,$this->img_h)),$lin_color);
}
}
/**
**边框的颜色
**$im为图像参数
*/
private function drawBorder($im){
if(preg_match("/^\d{1,3},\d{1,3},\d{1,3}$/",$this->bordercolor)){
$bcolor=explode(',',$this->bordercolor);
}
$lcolor=imagecolorallocate($im,$bcolor[0],$bcolor[1],$bcolor[2]);
//画边框的顺序为顺时针方向
imageline($im,0,0,$this->img_w,0,$lcolor);
imageline($im,$this->img_w-1,0,$this->img_w-1,$this->img_h,$lcolor);
imageline($im,0,$this->img_h-1,$this->img_w,$this->img_h-1,$lcolor);
imageline($im,0,0,0,$this->img_h-1,$lcolor);
}
/**
**@获得字体
**并随机返回其中一个随机的字体
*/
private function getFonts(){
$fontName=scandir($this->fontDir);
$fontNum=count($fontName)-2;
$font=mt_rand(2,($fontNum+2));
return "$this->fontDir/".$fontName[$font];
}
/**
**生成图像
*/
private function outImg($im){
if (function_exists("imagegif")) {
header ("Content-type: image/gif");
imagegif($im);
}
elseif (function_exists("imagepng")) {
header ("Content-type: image/png");
imagepng($im);
}
elseif (function_exists("imagejpeg")) {
header ("Content-type: image/jpeg");
imagejpeg($im, "", 80);
}
elseif (function_exists("imagewbmp")) {
header ("Content-type: image/vnd.wap.wbmp");
imagewbmp($im);
}
else
die("No Image Support On This Server !");
imagedestroy($im);
}
}
//初始设置
$v_mode=2; //图片的模式
$v_num=4; //验证码个数
$img_w=100; //图片宽度
$img_h=25; //图片高度
$border=1; //是否显示边框
$bordercolor='255,200,85'; //边框的颜色
$pix_num=50; //干扰像素的个数
$line_num=5; //干扰线条的个数
$f;
$test=new vCodeImg($v_mode,$v_num,$img_w,$img_h,$pix_num,$line_num,$border,$bordercolor,$fontDir);
$test->setVimage();
复制PHP内容到剪贴板
<?php
session_start();
?>
<img src="verify_image.php" alt="点此刷新验证码" name="verify_code" border="0" id="verify_code" style="cursor:pointer;" />
另外估计是默认session全局是关闭的,所以在调用的页面也要加上"session_start()",要不然可能读不到session的值PHP代码:
<?php
session_start();
?>
<img src="verify_image.php" alt="点此刷新验证码" name="verify_code" border="0" id="verify_code" style="cursor:pointer;" />
[ 本帖最后由 Mpower 于 2008-1-2 17:46 编辑 ]
作者: Mpower 发布时间: 2008-01-02

有第一次肯定有第二次.
不错不错.继续努力
作者: 逆雪寒 发布时间: 2008-01-02
一个函数就可以了嘛
作者: fnet 发布时间: 2008-01-02
继续努力

作者: luzhou 发布时间: 2008-01-04
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28