[php]
<?php
/**
* 圖片驗證碼類
* 生成圖片類型驗證碼,驗證碼包含數字和大寫字母,session中存放md5加密後的驗證碼
*
* 使用方法:
* $captcha = new Catpcha();
* $captcha->buildAndExportImage();
*
* 作 者: luojing
* 創建時間: 2013-3-27 上午11:42:12
*/
class Captcha {
private $width;//寬度
private $height; //高度
private $codeNum;//驗證碼字符數量
private $image;//驗證碼圖像資源
private $sessionKey;//session中保存的名字
private $captcha;//驗證碼字符串
const charWidth = 10;//單個字符寬度,根據輸出字符大小而變
/**
* 創建驗證碼類,初始化相關參數
* @param $width 圖片寬度
* @param $height 圖片高度
* @param $codeNum 驗證碼字符數量
* @param $sessionKey session中保存的名字
*/
function __construct($width = 50, $height = 20, $codeNum = 4, $sessionKey = 'captcha') {
$this->width = $width;
$this->height = $height;
$this->codeNum = $codeNum;
$this->sessionKey = $sessionKey;
//保證最小高度和寬度
if($height < 20) {
$this->height = 20;
}
if($width < ($codeNum * self::charWidth + 10)) {//左右各保留5像素空隙
$this->width = $codeNum * self::charWidth + 10;
}
}
/**
* 構造並輸出驗證碼圖片
*/
public function buildAndExportImage() {
$this->createImage();
$this->setDisturb();
$this->setCaptcha();
$this->exportImage();
}
/**
* 構造圖像,設置底色
*/
private function createImage() {
//創建圖像
$this->image = imagecreatetruecolor($this->width, $this->height);
//創建背景色
$bg = imagecolorallocate($this->image, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255));
//填充背景色
imagefilledrectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $bg);
}
/**
* 設置干擾元素
*/
private function setDisturb() {
//設置干擾點
for($i = 0; $i < 150; $i++) {
$color = imagecolorallocate($this->image, mt_rand(150, 200), mt_rand(150, 200), mt_rand(150, 200));
imagesetpixel($this->image, mt_rand(5, $this->width - 10), mt_rand(5, $this->height - 3), $color);
}
//設置干擾線
for($i = 0; $i < 10; $i++) {
$color = imagecolorallocate($this->image, mt_rand(150, 220), mt_rand(150, 220), mt_rand(150, 220));
imagearc($this->image, mt_rand(-10, $this->width), mt_rand(-10, $this->height), mt_rand(30, 300), mt_rand(20, 200), 55, 44, $color);
}
//創建邊框色
$border = imagecolorallocate($this->image, mt_rand(0, 50), mt_rand(0, 50), mt_rand(0, 50));
//畫邊框
imagerectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $border);
}
/**
* 產生並繪制驗證碼
*/
private function setCaptcha() {
$str = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
//生成驗證碼字符
for($i = 0; $i < $this->codeNum; $i++) {
$this->captcha .= $str{mt_rand(0, strlen($str) - 1)};
}
//繪制驗證碼
for($i = 0; $i < strlen($this->captcha); $i++) {
$color = imagecolorallocate($this->image, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200));
$x = floor(($this->width - 10)/$this->codeNum);
$x = $x*$i + floor(($x-self::charWidth)/2) + 5;
$y = mt_rand(2, $this->height - 20);
imagechar($this->image, 5, $x, $y, $this->captcha{$i}, $color);
}
}
/*
* 輸出圖像,驗證碼保存到session中
*/
private function exportImage() {
if(imagetypes() & IMG_GIF){
header('Content-type:image/gif');
imagegif($this->image);
} else if(imagetypes() & IMG_PNG){
header('Content-type:image/png');
imagepng($this->iamge);
} else if(imagetypes() & IMG_JPEG) {
header('Content-type:image/jpeg');
imagepng($this->iamge);
} else {
imagedestroy($this->image);
die("Don't support image type!");
}
//將驗證碼信息保存到session中,md5加密
if(!isset($_SESSION)){
session_start();
}
$_SESSION[$this->sessionKey] = md5($this->captcha);
imagedestroy($this->image);
}
function __destruct() {
unset($this->width, $this->height, $this->codeNum,$this->captcha);
}
}
<?php
/**
* 圖片驗證碼類
* 生成圖片類型驗證碼,驗證碼包含數字和大寫字母,session中存放md5加密後的驗證碼
*
* 使用方法:
* $captcha = new Catpcha();
* $captcha->buildAndExportImage();
*
* 作 者: luojing
* 創建時間: 2013-3-27 上午11:42:12
*/
class Captcha {
private $width;//寬度
private $height; //高度
private $codeNum;//驗證碼字符數量
private $image;//驗證碼圖像資源
private $sessionKey;//session中保存的名字
private $captcha;//驗證碼字符串
const charWidth = 10;//單個字符寬度,根據輸出字符大小而變
/**
* 創建驗證碼類,初始化相關參數
* @param $width 圖片寬度
* @param $height 圖片高度
* @param $codeNum 驗證碼字符數量
* @param $sessionKey session中保存的名字
*/
function __construct($width = 50, $height = 20, $codeNum = 4, $sessionKey = 'captcha') {
$this->width = $width;
$this->height = $height;
$this->codeNum = $codeNum;
$this->sessionKey = $sessionKey;
//保證最小高度和寬度
if($height < 20) {
$this->height = 20;
}
if($width < ($codeNum * self::charWidth + 10)) {//左右各保留5像素空隙
$this->width = $codeNum * self::charWidth + 10;
}
}
/**
* 構造並輸出驗證碼圖片
*/
public function buildAndExportImage() {
$this->createImage();
$this->setDisturb();
$this->setCaptcha();
$this->exportImage();
}
/**
* 構造圖像,設置底色
*/
private function createImage() {
//創建圖像
$this->image = imagecreatetruecolor($this->width, $this->height);
//創建背景色
$bg = imagecolorallocate($this->image, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255));
//填充背景色
imagefilledrectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $bg);
}
/**
* 設置干擾元素
*/
private function setDisturb() {
//設置干擾點
for($i = 0; $i < 150; $i++) {
$color = imagecolorallocate($this->image, mt_rand(150, 200), mt_rand(150, 200), mt_rand(150, 200));
imagesetpixel($this->image, mt_rand(5, $this->width - 10), mt_rand(5, $this->height - 3), $color);
}
//設置干擾線
for($i = 0; $i < 10; $i++) {
$color = imagecolorallocate($this->image, mt_rand(150, 220), mt_rand(150, 220), mt_rand(150, 220));
imagearc($this->image, mt_rand(-10, $this->width), mt_rand(-10, $this->height), mt_rand(30, 300), mt_rand(20, 200), 55, 44, $color);
}
//創建邊框色
$border = imagecolorallocate($this->image, mt_rand(0, 50), mt_rand(0, 50), mt_rand(0, 50));
//畫邊框
imagerectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $border);
}
/**
* 產生並繪制驗證碼
*/
private function setCaptcha() {
$str = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
//生成驗證碼字符
for($i = 0; $i < $this->codeNum; $i++) {
$this->captcha .= $str{mt_rand(0, strlen($str) - 1)};
}
//繪制驗證碼
for($i = 0; $i < strlen($this->captcha); $i++) {
$color = imagecolorallocate($this->image, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200));
$x = floor(($this->width - 10)/$this->codeNum);
$x = $x*$i + floor(($x-self::charWidth)/2) + 5;
$y = mt_rand(2, $this->height - 20);
imagechar($this->image, 5, $x, $y, $this->captcha{$i}, $color);
}
}
/*
* 輸出圖像,驗證碼保存到session中
*/
private function exportImage() {
if(imagetypes() & IMG_GIF){
header('Content-type:image/gif');
imagegif($this->image);
} else if(imagetypes() & IMG_PNG){
header('Content-type:image/png');
imagepng($this->iamge);
} else if(imagetypes() & IMG_JPEG) {
header('Content-type:image/jpeg');
imagepng($this->iamge);
} else {
imagedestroy($this->image);
die("Don't support image type!");
}
//將驗證碼信息保存到session中,md5加密
if(!isset($_SESSION)){
session_start();
}
$_SESSION[$this->sessionKey] = md5($this->captcha);
imagedestroy($this->image);
}
function __destruct() {
unset($this->width, $this->height, $this->codeNum,$this->captcha);
}
}