<?php
/**
* 驗證碼類
* [email protected]
* 2012-02-09
* */
class Vailimg {
private $width; //驗證碼圖片的寬度
private $height; //驗證碼圖片的高度
private $codeNum; //驗證碼字符的個數
private $checkCode; //驗證碼字符
private $image; //驗證碼畫布
/* 構造方法用來實例化驗證碼對象,並為一些成員屬性初使化 */
/* 參數width: 設置驗證碼圖片的寬度,默認寬度值為60像素 */
/* 參數height: 設置驗證碼圖片的高度,默認高度值為20像素 */
/* 參數codeNum: 設置驗證碼中字母和數字的個數,默認個數為4個 */
function __construct($width=60, $height=20, $codeNum=4) {
$this->width=$width; //為成員屬性width初使化
$this->height=$height; //為成員屬性height初使化
$this->codeNum=$codeNum; //為成員屬性codeNum初使化
$this->checkCode=$this->createCheckCode(); //為成員屬性checkCode初使化
}
function showImage(){ //通過訪問該方法向浏覽器中輸出圖像
$this->getCreateImage(); //調用內部方法創建畫布並對其進行初使化
$this->outputText(); //向圖像中輸出隨機的字符串
$this->setDisturbColor(); //向圖像中設置一些干擾像素
$this->outputImage(); //生成相應格式的圖像並輸出
}
function getCheckCode(){ //訪問該方法獲取隨機創建的驗證碼字符串
return $this->checkCode; //返回成員屬性$checkCode保存的字符串
}
private function getCreateImage(){ //用來創建圖像資源,並初使化背影
$this->image=imageCreate($this->width,$this->height);
$back=imageColorAllocate($this->image, 255, 255, 255);
$border=imageColorAllocate($this->image, 0, 0, 0);
imageRectangle($this->image,0,0,$this->width-1,$this->height-1,$border);
}
private function createCheckCode(){ //隨機生成用戶指定個數的字符串
for($i=0;$i<$this->codeNum;$i++) {
$number=rand(0,2);
switch($number){
case 0 : $rand_number=rand(48,57);break; //數字
case 1 : $rand_number=rand(65,90);break; //大寫字母
case 2 : $rand_number=rand(97,122);break; //小寫字母
}
$ascii=sprintf("%c",$rand_number);
$ascii_number=$ascii_number.$ascii;
}
return $ascii_number;
}
private function setDisturbColor() { //設置干擾像素,向圖像中輸出不同顏色的100個點
for ($i=0;$i<=50;$i++) {
$color = imagecolorallocate($this->image, rand(0,255), rand(0,255), rand(0,255));
imagesetpixel($this->image,rand(1,$this->width-2),rand(1,$this->height-2),$color);
}
}
private function outputText() { //隨機顏色、隨機擺放、隨機字符串向圖像中輸出
for ($i=0;$i<=$this->codeNum;$i++) {
$bg_color = imagecolorallocate($this->image, rand(0,255), rand(0,128), rand(0,255));
$x = floor($this->width/$this->codeNum)*$i+3;
$y = rand(0,$this->height-15);
imagechar($this->image, 5, $x, $y, $this->checkCode[$i], $bg_color);
}
}
private function outputImage(){ //自動檢測GD支持的圖像類型,並輸出圖像
if(imagetypes() & IMG_GIF){ //判斷生成GIF格式圖像的函數是否存在
header("Content-type: image/gif"); //發送標頭信息設置MIME類型為image/gif
imagegif($this->image); //以GIF格式將圖像輸出到浏覽器
}elseif(imagetypes() & IMG_JPG){ //判斷生成JPG格式圖像的函數是否存在
header("Content-type: image/jpeg"); //發送標頭信息設置MIME類型為image/jpeg
imagejpeg($this->image, "", 0.5); //以JPEN格式將圖像輸出到浏覽器
}elseif(imagetypes() & IMG_PNG){ //判斷生成PNG格式圖像的函數是否存在
header("Content-type: image/png"); //發送標頭信息設置MIME類型為image/png
imagepng($this->image); //以PNG格式將圖像輸出到浏覽器
}elseif(imagetypes() & IMG_WBMP){ //判斷生成WBMP格式圖像的函數是否存在
header("Content-type: image/vnd.wap.wbmp"); //發送標頭為image/wbmp
imagewbmp($this->image); //以WBMP格式將圖像輸出到浏覽器
}else{ //如果沒有支持的圖像類型
die("PHP不支持圖像創建!"); //不輸出圖像,輸出一錯誤消息,並退出程序
}
}
function __destruct(){ //當對象結束之前銷毀圖像資源釋放內存
imagedestroy($this->image); //調用GD庫中的方法銷毀圖像資源
}
}
?>
摘自chaojie2009的專欄