PHP生成Gif图片验证码_php实例
先看效果图
字体及字体文件的路径需要在类中$FontFilePath及$FontFileName中设置。如:
private static $FontFilePath = "static/font/"; //相对地本代码文件的位置
private static $FontFileName = array("3.ttf");// array("1.ttf", "2.ttf", "3.ttf", "4.ttf", "5.ttf", "6.ttf", "7.ttf", "8.ttf"); //
完整代码如下:
/**
说明: 验证码生成类,支持生成Gif图片验证码(带噪点,干扰线,网格,随机色背景,随机自定义字体,倾斜,Gif动画)
服务端:
$mod = strtolower(isset($_REQUEST["mod"]) ? $_REQUEST["mod"] : "");
if($mod == "code"){
echo SecurityCode::Draw(4, 1, 120, 30, 5, 10, 100, "secode");
die();
}
调用:
验证:
$reqCode = strtolower(isset($_REQUEST["secode"]) ? $_REQUEST["secode"] : ""); //请求的验证码
$sessionCode = strtolower(isset($_SESSION["secode"]) ? $_SESSION["secode"] : ""); //会话生成的验证码
if($reqCode != $sessionCode){
echo "安全验证码错误!";
die();
}
*/
$mod = strtolower(isset($_REQUEST["mod"]) ? $_REQUEST["mod"] : "");
if ($mod == "code") {
echo SecurityCode::Draw(4, 15, 100, 27, 10, 2, 100, "secode");
die();
}
//安全验证码类
class SecurityCode {
private static $Debug = 0;
private static $Code = '';
private static $Chars = 'bcdefhkmnrstuvwxyABCDEFGHKMNPRSTUVWXY34568';
//private static $Chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890';
private static $TextGap = 20;
private static $TextMargin = 5;
private static $FontFilePath = "static/font/"; //相对地本代码文件的位置
private static $FontFileName =array("3.ttf");// array("1.ttf", "2.ttf", "3.ttf", "4.ttf", "5.ttf", "6.ttf", "7.ttf", "8.ttf"); //
private static $Img = 'GIF89a'; //GIF header 6 bytes
private static $BUF = Array();
private static $LOP = 0;
private static $DIS = 2;
private static $COL = -1;
private static $IMG = -1;
/**
生成GIF图片验证
@param int $L 验证码长度
@param int $F 生成Gif图的帧数
@param int $W 宽度
@param int $H 高度
@param int $MixCnt 干扰线数
@param int $lineGap 网格线间隔
@param int $noisyCnt 澡点数
@param int $sessionName 验证码Session名称
*/
public static function Draw($L = 4, $F = 1, $W = 150, $H = 30, $MixCnt = 2, $lineGap = 0, $noisyCnt = 10, $sessionName = "Code") {
ob_start();
ob_clean();
for ($i = 0; $i self::$Code .= SubStr(self::$Chars, mt_rand(0, strlen(self::$Chars) - 1), 1);
}
if (!isset($_SESSION))
session_start();
$_SESSION[$sessionName] = strtolower(self::$Code);
$bgRGB = array(rand(0, 255), rand(0, 255), rand(0, 255));
//生成一个多帧的GIF动画
for ($i = 0; $i $img = ImageCreate($W, $H);
//背景色
$bgColor = imagecolorallocate($img, $bgRGB[0], $bgRGB[1], $bgRGB[2]);
ImageColorTransparent($img, $bgColor);
unset($bgColor);
//添加噪点
$maxNoisy = rand(0, $noisyCnt);
$noisyColor = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255));
for ($k = 0; $k imagesetpixel($img, rand(0, $W), rand(0, $H), $noisyColor);
}
//添加网格
if ($lineGap > 0) {
for ($m = 0; $m imageline($img, $m * $lineGap, 0, $m * $lineGap, $H, $noisyColor);
}
for ($n = 0; $n imageline($img, 0, $n * $lineGap, $W, $n * $lineGap, $noisyColor);
}
}
unset($noisyColor);
// 添加干扰线
for ($k = 0; $k $wr = mt_rand(0, $W);
$hr = mt_rand(0, $W);
$lineColor = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255));
imagearc($img, $W - floor($wr / 2), floor($hr / 2), $wr, $hr, rand(90, 180), rand(180, 270), $lineColor);
unset($lineColor);
unset($wr, $hr);
}
//第一帧忽略文字
if ($i != 0 || $F //文字
$foreColor = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255));
for ($j = 0; $j $fontFile = self::$FontFilePath . self::$FontFileName[rand(0, count(self::$FontFileName) - 1)];
if (!file_exists($fontFile))
imagestring($img, 4, self::$TextMargin + $j * self::$TextGap, ($H - rand($H / 2, $H)), self::$Code[$j], $foreColor);
else
imageTTFtext($img, rand(15, 18), rand(-15, 15), self::$TextMargin + $j * self::$TextGap, ($H - rand(7, 10)), $foreColor, $fontFile, self::$Code[$j]);
}
unset($foreColor);
}
ImageGif($img);
Imagedestroy($img);
$Imdata[] = ob_get_contents();
OB_clean();
}
unset($W, $H, $B);
if (self::$Debug) {
echo $_SESSION['code'];
echo '
', Var_Dump($Imdata), '
die();
}
header('Content-type:image/gif');
return self::CreateGif($Imdata, 20);
unset($Imdata);
}
private static function CreateGif($GIF_src, $GIF_dly = 10, $GIF_lop = 0, $GIF_dis = 0, $GIF_red = 0, $GIF_grn = 0, $GIF_blu = 0, $GIF_mod = 'bin') {
if (!is_array($GIF_src) && !is_array($GIF_tim)) {
throw New Exception('Error:' . __LINE__ . ',Does not supported function for only one image!!');
die();
}
self::$LOP = ($GIF_lop > -1) ? $GIF_lop : 0;
self::$DIS = ($GIF_dis > -1) ? (($GIF_dis self::$COL = ($GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1) ? ($GIF_red | ($GIF_grn for ($i = 0, $src_count = count($GIF_src); $i if (strToLower($GIF_mod) == 'url') {
self::$BUF[] = fread(fopen($GIF_src[$i], 'rb'), filesize($GIF_src[$i]));
} elseif (strToLower($GIF_mod) == 'bin') {
self::$BUF[] = $GIF_src[$i];
} else {
throw New Exception('Error:' . __LINE__ . ',Unintelligible flag (' . $GIF_mod . ')!');
die();
}
if (!(Substr(self::$BUF[$i], 0, 6) == 'GIF87a' Or Substr(self::$BUF[$i], 0, 6) == 'GIF89a')) {
throw New Exception('Error:' . __LINE__ . ',Source ' . $i . ' is not a GIF image!');
die();
}
for ($j = (13 + 3 * (2 switch (self::$BUF[$i]{$j}) {
case '!':
if ((substr(self::$BUF[$i], ($j + 3), 8)) == 'NETSCAPE') {
throw New Exception('Error:' . __LINE__ . ',Could not make animation from animated GIF source (' . ($i + 1) . ')!');
die();
}
break;
case ';':
$k = FALSE;
break;
}
}
}
self::AddHeader();
for ($i = 0, $count_buf = count(self::$BUF); $i self::AddFrames($i, $GIF_dly);
}
self::$Img .= ';';
return (self::$Img);
}
private static function AddHeader() {
$i = 0;
if (ord(self::$BUF[0]{10}) & 0x80) {
$i = 3 * (2 self::$Img .= substr(self::$BUF[0], 6, 7);
self::$Img .= substr(self::$BUF[0], 13, $i);
self::$Img .= "!\377\13NETSCAPE2.0\3\1" . chr(self::$LOP & 0xFF) . chr((self::$LOP >> 8) & 0xFF) . "\0";
}
unset($i);
}
private static function AddFrames($i, $d) {
$L_str = 13 + 3 * (2 $L_end = strlen(self::$BUF[$i]) - $L_str - 1;
$L_tmp = substr(self::$BUF[$i], $L_str, $L_end);
$G_len = 2 $L_len = 2 $G_rgb = substr(self::$BUF[0], 13, 3 * (2 $L_rgb = substr(self::$BUF[$i], 13, 3 * (2 $L_ext = "!\xF9\x04" . chr((self::$DIS > 0) & 0xFF) . chr(($d >> 8) & 0xFF) . "\x0\x0";
if (self::$COL > -1 && ord(self::$BUF[$i]{10}) & 0x80) {
for ($j = 0; $j if (ord($L_rgb{3 * $j + 0}) == (self::$COL >> 0) & 0xFF && ord($L_rgb{3 * $j + 1}) == (self::$COL >> 8) & 0xFF && ord($L_rgb{3 * $j + 2}) == (self::$COL >> 16) & 0xFF) {
$L_ext = "!\xF9\x04" . chr((self::$DIS > 0) & 0xFF) . chr(($d >> 8) & 0xFF) . chr($j) . "\x0";
break;
}
}
}
switch ($L_tmp{0}) {
case '!':
$L_img = substr($L_tmp, 8, 10);
$L_tmp = substr($L_tmp, 18, strlen($L_tmp) - 18);
break;
case ',':
$L_img = substr($L_tmp, 0, 10);
$L_tmp = substr($L_tmp, 10, strlen($L_tmp) - 10);
break;
}
if (ord(self::$BUF[$i]{10}) & 0x80 && self::$IMG > -1) {
if ($G_len == $L_len) {
if (self::Compare($G_rgb, $L_rgb, $G_len)) {
self::$Img .= ($L_ext . $L_img . $L_tmp);
} else {
$byte = ord($L_img{9});
$byte |= 0x80;
$byte &= 0xF8;
$byte |= (ord(self::$BUF[0]{10}) & 0x07);
$L_img{9} = chr($byte);
self::$Img .= ($L_ext . $L_img . $L_rgb . $L_tmp);
}
} else {
$byte = ord($L_img{9});
$byte |= 0x80;
$byte &= 0xF8;
$byte |= (ord(self::$BUF[$i]{10}) & 0x07);
$L_img{9} = chr($byte);
self::$Img .= ($L_ext . $L_img . $L_rgb . $L_tmp);
}
} else {
self::$Img .= ($L_ext . $L_img . $L_tmp);
}
self::$IMG = 1;
}
private static function Compare($G_Block, $L_Block, $Len) {
for ($i = 0; $i if ($G_Block{3 * $i + 0} != $L_Block{3 * $i + 0} || $G_Block{3 * $i + 1} != $L_Block{3 * $i + 1} || $G_Block{3 * $i + 2} != $L_Block{3 * $i + 2}) {
return (0);
}
}
return (1);
}
}
用法在类开头的注释里。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP中有四種主要錯誤類型:1.Notice:最輕微,不會中斷程序,如訪問未定義變量;2.Warning:比Notice嚴重,不會終止程序,如包含不存在文件;3.FatalError:最嚴重,會終止程序,如調用不存在函數;4.ParseError:語法錯誤,會阻止程序執行,如忘記添加結束標籤。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

在PHPOOP中,self::引用當前類,parent::引用父類,static::用於晚靜態綁定。 1.self::用於靜態方法和常量調用,但不支持晚靜態綁定。 2.parent::用於子類調用父類方法,無法訪問私有方法。 3.static::支持晚靜態綁定,適用於繼承和多態,但可能影響代碼可讀性。

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。
