php 验证码类
来源:原创
时间:2016-09-09
作者:脚本小站
分类:PHP
<?php
class Vcode{
private $image;
private $width;
private $height;
private $codeNumber;
private $fontSize;
private $ttf;
public $code; // <-- 调用此属性获取验证码字符串
/**
* 此类可以无需传任何参数,直接调用 display()方法即可
* 调用code属性获得验证码字符串,用于验证验证码是否正确
*
* @param $codeNumber int 验证码的个数
* @param $height int 验证码的高度
* @param $fontSize int 验证码字体大小
*
*/
function __construct($ttf = 'arial.ttf',$codeNumber = '4',$height = '30',$fontSize = '16'){
$this->ttf = $ttf;
$this->codeNumber = $codeNumber;
$this->fontSize = $fontSize;
$this->width = $this->fontSize*$this->codeNumber;
$this->height = $height;
}
/**
* 调用方法输出验证码,无参数
*/
public function display(){
$this->createImage();
$this->disturb();
$this->imageText();
$this->outImage();
}
//创建并填充画布
private function createImage(){
$this->image = imagecreatetruecolor($this->width,$this->height);
$color = imagecolorallocate($this->image,rand(220,255),rand(220,255),rand(220,255));
imagefill($this->image,0,0,$color);
return $this->image;
}
//为画布添加干扰元素
private function disturb(){
//点
for ($i = 0; $i < 100; $i++){
$color = imagecolorallocate($this->image,rand(0,250),rand(0,250),rand(0,250));
imagesetpixel($this->image,rand(0,$this->width),rand(0,$this->height),$color);
}
//线
for ($i = 0; $i < 30; $i++){
$color = imagecolorallocate($this->image,rand(0,200),rand(0,200),rand(0,200));
imageline($this->image,rand(0,$this->width),rand(0,$this->height),rand(0,$this->width),rand(0,$this->height),$color);
}
}
//添加文字
private function imageText(){
$string = "QWERTYUOPASDFGHJJJKZXCVBNMqwertyuopasdfghjkzxcvbnm234567890";
$str = substr(str_shuffle($string),0,$this->codeNumber);
for ($i = 0; $i < strlen($str); $i++){
$color = imagecolorallocate($this->image,rand(0,70),rand(0,70),rand(0,70));
imagettftext($this->image,$this->fontSize,rand(0,20),$this->fontSize*$i+1,floor($this->height*(23/30)),$color,$this->ttf,$str{$i});
}
return $this->code = $str;
}
//输出图像
private function outImage(){
header("content-type:image/png");
imagepng($this->image);
}
}
