<?php
namespace service;
class VerifyCode {
/**
* 存放图片,字体的根目录
* @var string
*/
private $resourceRoot = __DIR__;
/**
* 验证码的背景图
* @var string
*/
private $jamImg = "/jam_1.png";
/**
* 生成验证码所用的字体
* @var string
*/
private $font = '/LTYPEB.TTF';
/**
* 验证码图片宽
* @var int
*/
private $sizeWidth = 96;
/**
* 验证码图片高
* @var type
*/
private $sizeHeight = 30;
/**
* 验证码长度
* @var int
*/
private $codeLength = 4;
/**
* 验证码所包含的字符类型
* @var int
*/
private $chrType = 1;//1 数字,2 大写字母, 4 小写字母, 8 中文 混合类型为对应类型之和
/**
* 本次验证码内容
* @var string
*/
private $code = array();
/**
* 保存生成验证码将要用到的字符
* @var array
*/
private $chrs;
/**
* 生成的图片
* @var resource
*/
private $img;
/**
* 构造函数
*/
public function __construct($chrType = null, $codeLength = null) {
if($chrType){
$this->setChrType($chrType);
}
if($codeLength){
$this->setCodeLength($codeLength);
}
$this->jamImg = $this->resourceRoot.$this->jamImg;
$this->font = $this->resourceRoot.$this->font;
}
/**
* 设置生成验证码要用的字符类型
* @param int $chrType 1 数字,2 大写字母, 4 小写字母, 8 中文 混合类型为对应类型之和
*/
public function setChrType($chrType){
$this->chrType = $chrType;
}
/**
* 设置验证码的长度
* @param int $codeLength 验证码长度
*/
public function setCodeLength($codeLength){
$this->codeLength = $codeLength;
}
/**
* 初始化生成验证码将要用到的字符集
*/
private function initChrs(){
$this->chrs = array(
'length' => 0,
'code' => array()
);
if($this->chrType & 1){//数字
$this->addAscii(48, 10);
}
if($this->chrType & 2){//大写字母
$this->addAscii(65, 26);
}
if($this->chrType & 4){//小写字母
$this->addAscii(97, 26);
}
if($this->chrType & 8){//一级中文字
$this->addAscii(0, 3755);
}
}
/**
* 添加生成验证码要用到的字符集
* @param int $start 字符集起始Ascii码
* @param int $length 字符集长度
*/
private function addAscii($start, $length){
$this->chrs['code'][] = array($start, $length);
$this->chrs['length'] += $length;
}
/**
* 找出数值对应的中文字符
* @param int $code 数值
*/
private function codeToUTF8($code){
$y = $code % 94;
$x = ($code - $y) / 94;
$gb2312 = dechex(176 + $x).dechex(160 + $y + 1);
return iconv('gb2312', 'utf-8', pack('H*', $gb2312));
}
/**
* 将随机生成的数值转换成对应的字符
* @param int $code 随机数
* @return string
*/
private function transferCode($code){
foreach($this->chrs['code'] as $item){
if($code < $item[1]){
$code += $item[0];
break;
}else{
$code -= $item[1];
}
}
if($item[0]){
return chr($code);
}else{
return $this->codeToUTF8($code);
}
}
/**
* 生成验证码
*/
public function generateCode(){
$this->initChrs();
for($i = 0; $i < $this->codeLength; $i++){
$this->code[] = $this->transferCode(mt_rand(0, $this->chrs['length'] - 1));
}
return $this->getCode();
}
/**
* 给制验证码
*/
protected function createImage(){
$jamImg = imagecreatefrompng($this->jamImg);
$imageInfo = getimagesize($this->jamImg);
$this->img = imagecreatetruecolor($this->sizeWidth ,$this->sizeHeight);
imagefill($this->img, 0, 0, imagecolorallocate($this->img, 255, 255, 255));
foreach($this->code as $i => $chr){
$color = imagecolorallocate($this->img, rand(0,100), rand(0,100), rand(0,100));
imagettftext($this->img, rand(20, 25), rand(350, 370), $i*18+rand(0,5) + 10, 24+rand(0,5), $color, $this->font, $chr);
}
imagecopy($this->img, $jamImg, 0, 0, rand(0,$imageInfo[0]-$this->sizeWidth), rand(0,$imageInfo[1]-$this->sizeHeight), $this->sizeWidth ,$this->sizeHeight);
}
/**
* 输出验证码
*/
protected function printImage(){
header("Content-type: image/jpeg");
imagejpeg($this->img, null, 80);
imagedestroy($this->img);
}
/**
* 生成验证码
*/
public function draw(){
$this->createImage();
$this->printImage();
}
/**
* 获取本次验证码内容
* @return string
*/
public function getCode(){
return implode('', $this->code);
}
}
?>
public function picVerifyCode()
{
Session::start(true);
$verifyCode = new VerifyCode(1,4);
$_SESSION['verifyCode'] = $verifyCode->generateCode();
$verifyCode->draw();
}