php验证码类

本文介绍了一个使用PHP编写的验证码生成类。该类可以根据指定的宽度、高度和字符数量生成带有随机字符的验证码图片,并包含背景干扰元素以提高安全性。
<?php
/**
 * 
 * @author Administrator
 *
 */
class ValidateCode{
	
	private $width;
	private $height;
	private $codeNum;
	private $img_resouce;
	private $disturbColorNum;
	private $checkCode;
	
	function __construct($width=80,$height=20,$codeNum=4) {
		$this->width=$width;
		$this->height=$height;
		$this->codeNum=$codeNum;
		$this->checkCode=$this->CreateCheckCode();
		$number=floor($width*$height/25);
		if ($number>240-$codeNum) {
			$this->disturbColorNum=240-$codeNum;
		}else{
			$this->disturbColorNum=$number;
		}
	}
	
	public function showImage($fontpath='') {
		//创建图像背景
		$this->Img_resouce();
		//var_dump($img_resouce);
		//设置干扰元素
		$this->setDistructcolor();
		//向图像中随机画出文本
		$this->outputtext($fontpath);
		//输出图像
		$this->outputimage();
	}
	/**
	 * 
	 *获取随机创建的验证码 
	 */
	public function getCheckCode(){
		
	}
	private function Img_resouce(){
		//创建一个真彩图像
		$this->img_resouce=imagecreatetruecolor($this->width,$this->height);
		//随机设置图像背景
		$backcolor=imagecolorallocate($this->img_resouce,rand(225,255),rand(225,255),rand(225,255));
		//填充颜色
		imagefill($this->img_resouce, 0, 0, $backcolor);
		//设置边框背景
		$border=imagecolorallocate($this->img_resouce, 0,0,0);
		//画一个矩形
		imagerectangle($this->img_resouce,0,0,$this->width-1,$this->height-1,$border);
	}
	private function setDistructcolor(){
		//绘画干扰点
		for ($i = 0; $i <$this->disturbColorNum; $i++) {
			
		   imagesetpixel($this->img_resouce, rand(1, $this->width-2), rand(1, $this->height-2), rand(0,255));
		}
		
		//绘画干扰线
		for ($j = 0; $j <3; $j++) {
			$linecolor=imagecolorallocate($this->img_resouce,rand(0,255),rand(0,255),rand(0,255));
			imagearc($this->img_resouce, rand(0,$this->width), rand(0,$this->height),
			 rand(10, 225), rand(20, 150),
			 55, 44, $linecolor);
		}
	}
	private function CreateCheckCode(){
		$code='23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKMNPQRSTUVWXYZ';
	    $string='';
	    for ($i = 0; $i < $this->codeNum; $i++) {
	    	
	    	$char=$code{rand(0, strlen($code)-1)};
	    	$string.=$char;
	    }
	    return $string;
	}
	private function outputtext($fontpath=''){
		for ($i = 0; $i < $this->codeNum; $i++) {
			$fontcolor=imagecolorallocate($this->img_resouce, rand(0,128), rand(0, 128), rand(0, 128));
			if ($fontpath=='') {
				
	             $fontsize=rand(3, 5);
			     $x=floor($this->width/$this->codeNum)*$i+3;
			     $y=rand(0, $this->height-20);
			     imagechar($this->img_resouce, $fontsize, $x, $y, $this->checkCode{$i}, $fontcolor);
		}else{
			     $fontsize=rand(12, 16);
			     $x=floor(($this->width-8)/$this->codeNum)*$i+8;
			     $y=rand($fontsize, $this->height-15);
			     imagettftext($this->img_resouce,$fontsize,rand(-45,45),$x,$y,$fontcolor,fontpath,$this->checkCode{$i});
		     }
		}
	}
	private function outputimage() {
		
		if (imagetypes() & IMG_GIF) {
			header("Content-type: image/gif");
			imagegif($this->img_resouce);
		}else if(imagetypes() & IMG_JPEG) {
			header("Content-type: image/jpeg");
			imagejpeg($this->img_resouce);
		}else if(imagetypes() & IMG_PNG) {
			header("Content-type: image/png");
			imagepng($this->img_resouce);
		}else {
			echo "PHP不支持的类型";
		}
		
		
	}
	private function __destruct(){
		
		imagedestroy($this->img_resouce);
	}
}
?>

转载于:https://my.oschina.net/u/998304/blog/350602

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值