<?php
#封装验证码类
class Captcha{
#定义属性
private $width;
private $height;
private $chars; #随机字符长度
private $font; #随机字体
private $lines; #干扰线数量
private $pixels; #干扰点数量
private $type; #字符类型中文或英文 1为中文 其他为英文
#构造函数
public function __construct($arr=array()){
$this->width = isset($arr['width'])?$arr['width']:145;
$this->height = isset($arr['height'])?$arr['height']:30;
$this->chars = isset($arr['chars'])?$arr['chars']:4;
$this->font = isset($arr['font'])?$arr['font']:5;
$this->lines = isset($arr['lines'])?$arr['lines']:2;
$this->pixels = isset($arr['pixels'])?$arr['pixels']:100;
$this->type = isset($arr['type'])?$arr['type']:1;
if($this->type==1){
$this->ChaineseCaptcha();
}else{
$this->generate();
}
}
#生成画布以及干扰元素
public function makeBaseImage(){
#基本画布
$image = imagecreatetruecolor($this->width, $this->height);
#画布颜色,随机获取
$color = imagecolorallocate($image, mt_rand(200,255), mt_rand(200,255), mt_rand(200,255));
#画布填充
imagefill($image, 0, 0, $color);
#调用干扰线(点) 生成函数
#生成干扰元素
$this->setLines($image); #干扰线
$this->setPixel($image); #干扰点
#返回画布,供其他元素部分使用
return $image;
}
/**
* 生成中文验证码
* @param string $ttfname 使用的中文字体
* @param recoure $image 图片资源
* @param return 中文验证码
*/
public function ChaineseCaptcha($ttfname='./simkai.ttf'){
#使用makeChainese得到的字符
#生成画布
$image =$this->makeBaseImage();
#在画布上写中文文字
#文字颜色
$color = imagecolorallocate($image,mt_rand(0,100), mt_rand(0,100), mt_rand(0,100));
#获取要操作的中文验证码文字
$captcha =$this->makeChainese();
#开启sesssion
@session_start();
$_SESSION['captcha'] = $captcha;
#画出文字
imagettftext($image, 15, 2, 30, 20, $color, $ttfname, $captcha);
#显示验证码
$this->show($image);
#销毁资源
imagedestroy($image);
}
/** 该环境是在 utf-8 下使用,若是gbk,请谨慎使用
* @param string $filename 保存的中文文字文件
* @return char_chainese
*
*/
private function makeChainese($filename='./content_chainese.txt'){
$str = file_get_contents($filename);
$captcha ='';
#循环三次,取三个中文字符
for($i=0 ;$i<3 ;$i++){
$rand = mt_rand(0 ,strlen($str)-1);
$rand = $rand-($rand%3);
$captcha .=substr($str, $rand,3);
}
return $captcha;
}
#生成验证码图片的方法
/**
* @return 图片
*/
public function generate(){
#制作画布
$image =$this->makeBaseImage();
#生成随机字符
$captcha = $this->setRandCaptcha($image ,$this->chars);
#session 保存
session_start();
$_SESSION['captcha'] = $captcha;
#把字符串写入图片资源
#颜色
$color = imagecolorallocate($image,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));
imagestring($image ,$this->font ,20,3,$captcha ,$color);
$this->show($image);
#释放图片资源
imagedestroy($image);
}
private function show($image){
header("content-type:image/png");
imagepng($image);
}
#生成随机字符
private function setRandCaptcha(){
#生成随机字符串
// $str =implode('' ,array_merge(range('1', '9'),range('a', 'z'),range('A', "Z")));
$str = "23456789ABCDEFGHJKLMNPQRSTUVYXZabcdefghkmnpqrstuvyxz";
#得到随机字符串
$captcha ='';
for($i=0 ;$i<$this->chars ;$i++){
$captcha .=$str[mt_rand(0,strlen($str)-1)].'';
}
return $captcha;
}
#增加干扰线
/**
* @param resource $image
*/
private function setLines($image){
#线的颜色
for($i=0 ; $i<$this->lines ;$i++){
$color = imagecolorallocate($image, mt_rand(100,150), mt_rand(100,150), mt_rand(100,150));
imageline($image, mt_rand(0,$this->width), mt_rand(0,$this->height), mt_rand(0,$this->width), mt_rand(0,$this->height), $color);
}
}
#增加像素点
/**
* @return 返回点
*/
private function setPixel($image){
#循环画点
for($i=0;$i<$this->pixels;$i++){
$color=imagecolorallocate($image,mt_rand(150,200), mt_rand(150,200), mt_rand(150,200));
#生成点
imagesetpixel($image, mt_rand(0,$this->width), mt_rand(0,$this->height), $color);
}
}
#增加验证方法
/**
* @param string $captcha 用户输入的验证码
* @return boolean
*/
public static function compareCaptcha($captcha){
#比较,不区分大小写
#开启session
session_start();
return strtolower($captcha)===strtolower($_SESSION['captcha']);
}
}
$c = new Captcha(array('type'=>1));