<?php /** * 验证码类 */ class Verify { //成员属性 private $width; //宽 private $height; //高 private $verify_code; //验证码字符串 private $verify_nums; //验证码个数 private $verify_type; //验证码字符类型 private $image_type; //图片类型(JPG/PNG) private $res; //图片资源 //构造函数来执行需要初始化的成员属性 public function __construct($width = 120,$height = 50,$verify_nums = 4,$verify_type = 3,$image_type = ‘png‘) { $this->width = $width; $this->height = $height; $this->verify_nums = $verify_nums; $this->verify_type = $verify_type; $this->image_type = $image_type; $this->verify_code = $this->setVerifyCode(); $this->res = $this->createRes(); } //唯一供别人调用的输出方法 public function show() { $this->createRes(); $this->fillBackground(); $this->fillPix(); $this->fillArc(); $this->fillVerifyCode(); $this->outPutImg(); } //准备画布 private function createRes() { return imagecreatetruecolor($this->width, $this->height); } //创建颜色(深色、亮色) private function createDarkColor() { /*$res = $this->res; $color1 = mt_rand(0,120); //red $color2 = mt_rand(0,120); //green $color3 = mt_rand(0,120); //blue return imagecolorallocate($res,$color1,$color2,$color3);*/ return imagecolorallocate($this->res,mt_rand(0,120),mt_rand(0,120),mt_rand(0,120)); } //创建亮色给字符串用 private function createLightColor() { return imagecolorallocate($this->res,mt_rand(130,255),mt_rand(130,255),mt_rand(130,255)); } //填充背景色 private function fillBackground() { /*$res = $this->res; $x = 0; $y = 0; $color = $this->createDarkColor(); return imagefill($res,$x,$y,$color);*/ imagefill($this->res,0,0,$this->createDarkColor()); } //添加干扰元素 private function fillPix() { $nums = ($this->width * $this->height) / 20; for ($i=0; $i < $nums; $i++) { $x = mt_rand(0,$this->width); $y = mt_rand(0,$this->height); imagesetpixel($this->res, $x, $y, $this->createDarkColor()); } } //添加干扰弧线 private function fillArc() { for ($i=0; $i < 20 ; $i++) { $cx = mt_rand(0,$this->width); //中心点x坐标 $cy = mt_rand(0,$this->height); //中心点y坐标 $w = mt_rand(10,$this->width/2); //弧线宽度 $h = mt_rand(5,$this->height/2); //弧线高度 $s = mt_rand(0,180); //起点角度 $e = mt_rand(181,360); //终点角度 imagearc($this->res,$cx,$cy,$w,$h,$s,$e,$this->createDarkColor()); } } //产生验证码字符 private function setVerifyCode() { $verify_code = ‘‘; switch ($this->verify_type) { case 1: //纯数字的验证码取4个 $str = join(‘‘,array_flip(range(0,9),$this->verify_nums)); break; case 2: $str = join(‘‘,array_rand(array_flip(range(‘a‘,‘z‘)),$this->verify_nums)); break; case 3: $str = ‘qwertyuiplkjhgfdsaxcvbnmQWERTYUPLKJHGFDSAXCVBNM23456789‘; $str = substr(str_shuffle($str), 0,$this->verify_nums); break; default: die(‘请输入指定验证码的字符类型<br/>‘); } $verify_code = $str; return $verify_code; } //把字符串弄到画布上 $this->fillVerifyCode = ‘abda‘ //弱类型语言就比较随意 private function fillVerifyCode() { for ($i=0; $i < $this->verify_nums; $i++) { $every_width = $this->width /$this->verify_nums; /*mt_rand($every_width * 0,$every_width); mt_rand($every_width * 1,$every_width); mt_rand($every_width * 2,$every_width); mt_rand($every_width * 3,$every_width); $x = mt_rand((($this-width / $this->verify_nums) * $i) + 5,($this-width / $this->verify_nums) * ($i+1) - 5) ;*/ $x = mt_rand($every_width * $i + 10 ,$every_width * ($i + 1) -10); $y = mt_rand(10,$this->height - 20); imagechar($this->res, 5, $x, $y, $this->verify_code[$i], $this->createLightColor()); } } //输出图片 private function outPutImg() { header(‘Content-type:image/‘.$this->image_type); $func = ‘image‘ . $this->image_type; $func($this->res); } public function __get($name) { if ($name == ‘verify_code‘) { return $this->verify_code; } } //销毁资源 public function __destruct() { imagedestroy($this->res); } } $v = new Verify(); $v->show();
时间: 2024-10-14 09:11:39