<?php
/*
* 封装验证码类
*/
class Captcha
{
//成员属性
private $width = 100; //画布的宽度
private $height = 30; //画布的高度
private $number = 4; //验证码的字符个数
private $font_file = 'STHUPO.TTF'; //验证码的字体文件
private $font_size = 20; //验证码的字体大小
public function __set($p,$v)
{
if(property_exists($this, $p)){
$this -> $p = $v;
}
}
public function __get($p)
{
if(property_exists($this, $p)){
return $this -> $p;
}
}
//开始绘制验证码
public function makeImage()
{
//1. 创建画布,背景颜色应该是随机产生的,尽量背景颜色浅一点
$image = imagecreatetruecolor($this->width, $this->height);
//2. 分配颜色
$color = imagecolorallocate($image, mt_rand(100,255), mt_rand(100,255), mt_rand(100,255));
imagefill($image, 0, 0, $color);
//3. 开始绘制文字
$code = $this->makeCode();
for($i=0;$i<strlen($code);$i++){
imagettftext($image, $this->font_size, mt_rand(-30,30), ($this->width/$this->number)*$i+5, 20, mt_rand(0,100), $this->font_file, $code[$i]);
}
//绘制100个干扰像素点
for($i=0;$i<100;$i++){
imagesetpixel($image, mt_rand(0,$this->width), mt_rand(0,$this->height), mt_rand(0,100));
}
//练习:绘制10条干扰线条
for($i=0;$i<10;$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);
}
//3. 输出到浏览器
header("Content-Type:image/png");
imagepng($image);
//4. 销毁图像资源
imagedestroy($image);
}
//生成随机的字符
public function makeCode()
{
//大写字母,range()用来生成一个数组,包含从指定的开始字符到结束字符范围内的元素的数组
$upper = range('A','Z');
//小写字母
$lower = range('a','z');
//数字,避免0、1、2
$number = range(3,9);
//把3个数组合并成一个数组
$code = array_merge($lower,$upper,$number);
//打乱数组顺序
shuffle($code);
//根据属性中指定的字符个数,创建字符
$str = '';
for($i=0;$i<$this->number;$i++){
$str .= $code[$i];
}
//echo '<pre>';
//var_dump($str);
return $str;
}
}
$captcha = new Captcha();
$captcha -> makeImage();