初學Php,因為很多地方都涉及到驗證碼的功能,網上雖然有很多驗證碼的例子,但是看了之后都不是很滿意。于是,自己隨便看了一下書,寫了一個簡單地Php驗證碼類,可以提供簡單的生成一個驗證碼類。當然,這個類也是剛剛寫好,還有很多可以改進的地方。
下面是代碼。
<?php/* 2014/3/28 @程序與算法*/html' target='_blank'>class checkCode{ private $m_fontFile = ""; //儲存引入的字體文件路徑 private $m_fontSize = 16; // 字體大小 private $m_str = ""; //儲存生成驗證碼的字符串 private $m_width = 80; //驗證碼圖片的寬度 private $m_heigh = 30; //驗證碼圖片的高度 private $m_bg = array("0xff", "0xff", "0xff"); //默認的背景顏色 private $m_tg = array("0x00", "0x00", "0x00"); //默認的字體顏色 private $m_ig; //圖片變量 private $m_isbg = ""; private $m_istg = ""; private $m_codearray = array(); //動態生成驗證碼的字符數組,這里是0-9,a-z,A-Z private $m_codeNum = 4; //驗證碼的長度 //構造函數,可以傳入寬度和高度,也可以使用默認的值 public function __construct($m_w = "", $m_h = "") { $this->createCodeArray(); //用于生成隨機字符串 if ($m_w == "" || $m_h == "") { $this->m_ig = imagecreate($this->m_width, $this->m_heigh); } else { $this->m_ig = imagecreate($m_w, $m_h); $this->m_width = $m_w; $this->m_heigh = $m_h; } $this->setBgColor($this->m_bg[0], $this->m_bg[1], $this->m_bg[2]); } public function __destruct() { imagedestroy($this->m_ig); } public function setBgColor($m_r, $m_g, $m_b) //設置驗證碼的背景顏色 { $this->m_ig = imagecreate($this->m_width, $this->m_heigh); $this->m_isbg = imagecolorallocate($this->m_ig, $m_r, $m_g, $m_b); return $this->m_isbg; } public function setTxColor($m_r, $m_g, $m_b) //設置字體顏色 { $this->m_istg = imagecolorallocate($this->m_ig, $m_r, $m_g, $m_b); return $this->m_istg; } public function setCodeCount($m_num) //設置驗證碼的長度 { $this->m_codeNum = $m_num; } // 設置驗證碼的字符串,這個字符串可以是用戶自己設置的,也可以是由系統自動生成隨機的字符串 public function setCodeStr($str) { $this->m_str = $str; } public function setCodeFontSize($size) //設置驗證碼字體的大小 { $this->m_fontSize = $size; } public function setCodeFontFile($file) //設置字體類型,如果不調用這個函數,就使用默認的字體 { if (file_exists($file)) { $this->m_fontFile = $file; } } public function createCodeArray() //生成隨機字符串的數組 { $m_aa = ord('A'); $m_AB = ord('a'); for ($m_i = 0; $m_i < 36; ++ $m_i) { if ($m_i >= 0 && $m_i < 10) { array_push($this->m_codearray, $m_i); } else { $m_temp = chr($m_aa + $m_i - 10); array_push($this->m_codearray, $m_temp); $m_temp = chr($m_AB + $m_i - 10); array_push($this->m_codearray, $m_temp); } } } public function createMass() //生成雜點 { $m_line = imagecolorallocate($this->m_ig, 0xdd, 0xdd, 0xdd); for ($m_i = 0; $m_i < ($this->m_width + $this->m_heigh) / 50; ++ $m_i) { $m_fx = rand(0, $this->m_width); $m_fy = rand(0, $this->m_heigh); $m_sx = rand(0, $this->m_width); $m_sy = rand(0, $this->m_heigh); imageline($this->m_ig, $m_fx, $m_fy, $m_sx, $m_sy, $m_line); } $m_point = imagecolorallocate($this->m_ig, 0x00, 0x00, 0x00); for ($m_i = 0; $m_i < $this->m_width * $this->m_heigh / 50; ++ $m_i) { $m_fx = rand(0, $this->m_width); $m_fy = rand(0, $this->m_heigh); imagesetpixel($this->m_ig, $m_fx, $m_fy, $m_point); } } private function deutCode() //默認字體生成的驗證碼圖片 { @$m_arrstr = str_split($this->m_str); //$this->createMass(); if ($this->m_str == "") { for ($m_i = 0; $m_i < $this->m_codeNum; ++ $m_i) { $m_index = rand(0, count($this->m_codearray) - 1); $m_tempx = ($this->m_width / $this->m_codeNum) * ($this->m_codeNum - 1) / $this->m_codeNum; $m_w = $m_tempx * ($m_i + 1); $m_dh = $this->m_heigh / 4; $m_h = rand($m_dh * 0.6, $m_dh * 1.5); imagestring($this->m_ig, $this->m_fontSize, $m_w, $m_h, $this->m_codearray[$m_index], $this->m_istg); } } else { $m_len = count($m_arrstr); for ($m_i = 0; $m_i < $m_len; ++ $m_i) { $m_tempx = ($this->m_width / $m_len) * ($m_len - 1) / $m_len; $m_w = $m_tempx * ($m_i + 1); $m_dh = $this->m_heigh / 4; $m_h = rand($m_dh * 0.6, $m_dh * 1.5); imagestring($this->m_ig, $this->m_fontSize, $m_w, $m_h, $m_arrstr[$m_i], $this->m_istg); } } imagepng($this->m_ig); } private function chgeCode() //新字體生成的驗證碼圖片 { @$m_arrstr = str_split($this->m_str); if ($this->m_str == "") { for ($m_i = 0; $m_i < $this->m_codeNum; ++ $m_i) { $m_index = rand(0, count($this->m_codearray) - 1); $m_tempx = ($this->m_width / $this->m_codeNum) * ($this->m_codeNum - 1) / $this->m_codeNum; $m_w = $m_tempx * ($m_i + 1); $m_h = $this->m_heigh / 1.2; $m_angel = rand(0, 60); imagefttext($this->m_ig, $this->m_fontSize, $m_angel, $m_w, $m_h, $this->m_istg, $this->m_fontFile, $this->m_codearray[$m_index]); } } else { $m_len = count($m_arrstr); for ($m_i = 0; $m_i < $m_len; ++ $m_i) { $m_tempx = ($this->m_width / $m_len) * ($m_len - 1) / $m_len; $m_w = $m_tempx * ($m_i + 1); $m_h = $this->m_heigh / 1.2; $m_angel = rand(0, 45); imagefttext($this->m_ig, $this->m_fontSize, $m_angel, $m_w, $m_h, $this->m_istg, $this->m_fontFile, $m_arrstr[$m_i]); } } } public function getCode() //獲取驗證碼的函數,這個函數就是相當于生成驗證碼 { if ($this->m_istg == "") { $this->setTxColor($this->m_tg[0], $this->m_tg[1], $this->m_tg[2]); } $this->createMass(); //這個函數下面會有說明是一個生成隨機雜點的函數 if ($this->m_fontFile == "") { $this->deutCode(); } else { $this->chgeCode(); } imagepng($this->m_ig); }}?>
該類的使用方法一,這是最簡單的形式。
1. 首先引入該類
2. 初始化,不想類傳遞任何參數,全部使用默認、
3. 生成驗證碼
具體的代碼如下
<?php include "checkCode.php";?><?php header("Content-Type:image/png"); $m_code = new checkCode(); $m_code->getCode();?>方法二,通過傳遞參數,生成更加漂亮的驗證碼。(推薦使用這個方法,因為系統默認的字體不是很清晰而且比較?。?p>
<?php include "checkCode.php";?><?php header("Content-Type:image/png"); $m_code = new checkCode(100, 50); // 或者 $m_code = new checkCode(200, 50);傳遞寬度和高度 $m_code->setCodeFontFile("Arial.ttf"); //引入新的字體 $m_code->setCodeFontSize(22); //設置字體大小 $m_code->setCodeCount(5); //設置驗證碼的長度 //背景顏色參數為RGB的分量值, 0-255 使用十六進制 0x00-0xff $m_code->setBgColor(0xdd, 0xcc, 0xcc); $m_code->setTxColor(0x00, 0x11, 0x22); //,字體顏色同上 $m_code->getCode();?>
在上述的介紹中,還可以使用一個函數
public function setCodeStr($str)
{
$this->m_str = $str;
}
這個函數用于接收用戶傳進來的字符串,比如說,$m_code->setCodeStr("12345678");
那么生成的圖片里面的字符就是 12345678
其實,在那個生成雜點的函數做的不是很好,可以再次接受用戶的輸入,來生成雜點??梢宰層脩魜磉x擇設置雜點的顏色,雜店的數量等等。。這些還是需要解決的。由于時間緊促,只能先把這個類實現到這個樣子了。
PHP編程鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答