红穆笔记
首頁 語言筆記 PHP圖片驗證碼如何實現?更加完善的封裝
語言筆記 PHP

PHP圖片驗證碼如何實現?更加完善的封裝

PHP图片验证码如何实现?更加完善的封装

以下是一個更完善的驗證碼類:

/**
 * 驗證碼生成工具類
 */
class Captcha
{
    protected $length = 4; // 驗證碼長度
    protected $fonts = ['arial.ttf']; // 驗證碼字體
    protected $width = 100; // 驗證碼寬度
    protected $height = 40; // 驗證碼高度
    protected $bg_color = [255, 255, 255]; // 背景顏色
    protected $text_color = [0, 0, 0]; // 驗證碼字體顏色
    protected $pixel_noise = 0; // 像素噪點密度
    protected $line_noise = 0; // 直線噪點密度

    public function __construct($options = [])
    {
        foreach ($options as $key => $value) {
            $this->$key = $value;
        }
    }

    public function generate()
    {
        // 創建畫布
        $image = imagecreatetruecolor($this->width, $this->height);

        // 設定背景色
        $bg_color = imagecolorallocate($image, ...$this->bg_color);
        imagefill($image, 0, 0, $bg_color);

        // 生成驗證碼字符串
        $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
        $str = '';
        for ($i = 0; $i < $this->length; $i++) {
            $str .= $chars[mt_rand(0, strlen($chars) - 1)];
        }

        // 繪製驗證碼字符串
        $text_color = imagecolorallocate($image, ...$this->text_color);
        $char_width = $this->width / $this->length;
        $char_height = $this->height - 8;
        $font_size = $char_height * 0.75;
        foreach (str_split($str) as $i => $char) {
            $font_file = __DIR__ . '/fonts/' . $this->fonts[mt_rand(0, count($this->fonts) - 1)];
            $angle = mt_rand(-10, 10);
            $x = $char_width * $i + ($char_width - $font_size) / 2;
            $y = $char_height + $font_size / 2 - 4;
            imagettftext($image, $font_size, $angle, $x, $y, $text_color, $font_file, $char);
        }

        // 添加像素噪點
        if ($this->pixel_noise > 0) {
            for ($i = 0; $i < $this->pixel_noise; $i++) {
                $x = mt_rand(0, $this->width);
                $y = mt_rand(0, $this->height);
                $color = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
                imagesetpixel($image, $x, $y, $color);
            }
        }

        // 添加直線噪點
        if ($this->line_noise > 0) {
            for ($i = 0; $i < $this->line_noise; $i++) {
                $x1 = mt_rand(0, $this->width);
                $y1 = mt_rand(0, $this->height);
                $x2 = mt_rand(0, $this->width);
                $y2 = mt_rand(0, $this->height);
                $color = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
                imageline($image, $x1, $y1, $x2, $y2, $color);
            }
        }

        // 輸出圖像
        header('Content-type: image/png');
        imagepng($image);

        // 釋放資源
        imagedestroy($image);

        // 把驗證碼字符串存儲到會話中
        session_start();
        $_SESSION['captcha'] = strtolower($str);
    }

    public function validate($input)
    {
        session_start();
        $captcha = isset($_SESSION['captcha']) ? $_SESSION['captcha'] : '';
        unset($_SESSION['captcha']);
        return strtolower($input) === strtolower($captcha);
    }
}

示例使用方法:

// 實例化驗證碼生成器
$captcha = new Captcha([
    'length' => 4, // 驗證碼長度
    'width' => 120, // 驗證碼寬度
    'height' => 32, // 驗證碼高度
    'bg_color' => [240, 240, 240], // 背景顏色
    'text_color' => [20, 20, 20], // 字體顏色
    'pixel_noise' => 50, // 像素噪點密度
    'line_noise' => 5,  // 直線噪點密度
]);

// 生成驗證碼
$captcha->generate();

// 驗證驗證碼
if ($captcha->validate($_POST['captcha'])) {
    echo '驗證通過';
} else {
    echo '驗證失敗';
}

此驗證碼類有以下改進:

  • 可以通過構造函數傳遞參數,而不需要通過類屬性手動配置;
  • 可以配置多個字體文件,每次繪製驗證碼時隨機選擇一個字體;
  • 可以配置像素噪點和直線噪點密度。
微信赞赏

微信

支付宝赞赏

支付寶

✍️ 作者: 紅穆

網站管理員 · 感謝閱讀,更多精彩內容敬請關注

作者主頁 查看主頁 →

相關文章

PHP ob函数记录

PHP ob函數記錄 語言筆記 PHP

下面3個函數的用法 ob_get_contents(); ob_end_clean(); ob_start(); 可以藉助這幾個函數實現緩衝本地文件,以及執行本地腳本代碼。 使用ob_start()把輸出的代碼存到緩衝區,頁面不會顯示出來; 然後用ob_get_contents得到緩衝區的數據。 o…
👁 143
PHP preg

PHP preg 語言筆記 PHP

preg_match_all 函數用於執行一個全局正則表達式匹配。preg_match_all() 語法int preg_match_all ( string $pattern , string $subject [, array &amp;$matches [, int $flags = PREG…
👁 169
PHP 三元运算符与if的详解

PHP 三元運算符與if的詳解 語言筆記 PHP

三元運算符語條件 ? 結果1 : 結果2 說明:問號前面的位置是判斷的條件,如果滿足條件時結果1,不滿足時結果2。本文對三元運算符和if...else...進行對比詳解,希望對大家有所幫助。今天在改論文在線的時候遇到了一個語句看不懂:$if_summary = $row['IF_SUMMARY']=…
👁 191
PHP强制转换类型

PHP強制轉換類型 語言筆記 PHP PHP採集 PHP與mysql

獲取數據類型1.如果想查看某個表達式的值和類型,用var_dump()。 2.如果只是想得到一個易讀懂的類型的表達方式用於調試,用 gettype()。3.要查看某個類型,不要用 gettype(),而用is_type() 函數。字符串轉換爲數值當一個字符串被當作數字來求值時,根據以下規則來決定結果…
👁 232
php 字符串中是否包含指定字符串的多种方法

php 字符串中是否包含指定字符串的多種方法 語言筆記 PHP

strstrstrstr() 函數搜索一個字符串在另一個字符串中的第一次出現。該函數返回字符串的其餘部分(從匹配點)。如果未找到所搜索的字符串,則返回 false。代碼如下:&lt;?php $email = 'user@example.com'; $domain = strstr($email, …
👁 138

推薦閱讀

响应式制砂输送系统类网站模板 0061

響應式制砂輸送系統類網站模板 0061 實用收藏 易優模板

此套eyoucms響應式模板適用於制砂與輸送系統類企業,設計風格專業工業,能夠展示制砂設備、輸送系統產品及工程案例。有助於礦山機械企業在線上展示產品,吸引礦業與建築客戶。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CM…
👁 42
(自适应手机端)响应式瓷砖大理石建材类网站pbootcms模板 html5装修建材网站模板下载 0475

(自適應手機端)響應式瓷磚大理石建材類網站pbootcms模板 html5裝修建材網站模板下載 0475 實用收藏 pbootcms模板

本套自適應移動端的寬屏大氣淨水器設備與智能電子設備PbootCMS網站模板。設計風格現代科技,適合展示淨水產品、智能硬件及解決方案。有助於淨水器品牌在線上展示產品,吸引家庭與商用客戶。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4s5.c…
👁 55
职业教育培训机构网站模板 0855

職業教育培訓機構網站模板 0855 實用收藏 易優模板

此套eyoucms模板適用於職業教育培訓機構,設計風格專業教育,能夠展示職業教育課程、培訓項目、就業服務及師資力量。有助於職業培訓機構在線上吸引學員,提升品牌知名度。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CMS(…
👁 33
响应式装修建材类网站模板 0063

響應式裝修建材類網站模板 0063 實用收藏 易優模板

一款針對裝修建材類企業的eyoucms響應式網站模板。設計風格現代專業,能夠展示建材產品、裝修案例及品牌形象。有助於建材品牌在線上吸引裝修公司與業主,提升品牌知名度。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CMS(…
👁 37
(自适应手机版)幽默笑话网站pbootcms模板 搞笑趣图类网站源码下载 0476

(自適應手機版)幽默笑話網站pbootcms模板 搞笑趣圖類網站源碼下載 0476 實用收藏 pbootcms模板

一款自適應移動端的機械製造與藍色工業機械設備PbootCMS網站模板。設計風格專業工業,適合各類機械設備製造企業展示產品系列。有助於機械公司在線上搭建品牌形象站,吸引工業客戶。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4s5.cn相關文…
👁 56
儿童教育培训机构网站模板 0856

兒童教育培訓機構網站模板 0856 實用收藏 易優模板

一款針對兒童教育培訓機構的eyoucms網站模板。設計風格活潑教育,能夠展示兒童培訓課程、教學環境、師資力量及學員成果。有助於兒童教育機構在線上吸引家長,提升品牌形象。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CMS…
👁 55