當前位置: 首頁> 最新文章列表> 如何使用PHP的imagefontwidth函數實現一個自適應寬度的圖片驗證碼系統?

如何使用PHP的imagefontwidth函數實現一個自適應寬度的圖片驗證碼系統?

M66 2025-07-10

在開發網站時,驗證碼系統是防止惡意註冊和機器人攻擊的重要手段。 PHP內置了強大的GD庫,可以輕鬆創建自定義的圖片驗證碼。其中, imagefontwidth函數可以幫助我們動態計算字符寬度,從而實現驗證碼圖片的自適應寬度設計,使得驗證碼顯示更美觀合理。

本文將詳細講解如何利用PHP的imagefontwidth函數實現一個自適應寬度的圖片驗證碼系統。


1. imagefontwidth函數簡介

imagefontwidth是PHP GD庫中的一個函數,用來返回內置字體中單個字符的寬度(單位:像素)。其基本用法如下:

 imagefontwidth(int $font): int

參數$font是一個整數,表示字體大小,範圍從1到5,數字越大字體越大。

這個函數常與imagefontheight搭配使用,用來精確計算字符所佔空間。


2. 設計思路

創建自適應寬度的驗證碼圖片,主要步驟是:

  1. 生成驗證碼字符串(通常是隨機字母和數字的組合)

  2. 計算驗證碼總寬度<br> 使用imagefontwidth獲取單個字符寬度,乘以字符數量,得到整張驗證碼所需寬

  3. 根據寬度創建畫布<br> 使用imagecreatetruecolor創建指定寬度和高度的圖

  4. 繪製驗證碼字符<br> 按順序將字符寫入圖片,位置從左到右排

  5. 輸出圖片並銷毀資源


3. 實現示例

以下是一個完整的示例代碼,演示如何實現一個基於imagefontwidth的自適應寬度驗證碼:

 <?php
// 生成隨機驗證碼字符串
function generateCaptchaCode($length = 5) {
    $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; // 避免容易混淆的字符
    $code = '';
    for ($i = 0; $i < $length; $i++) {
        $code .= $chars[random_int(0, strlen($chars) - 1)];
    }
    return $code;
}

// 主函數生成驗證碼圖片
function createCaptchaImage($code) {
    $font = 5; // 使用內置字體大小5
    $charWidth = imagefontwidth($font);
    $charHeight = imagefontheight($font);
    $padding = 10; // 左右邊距

    // 計算圖片寬度和高度
    $width = $charWidth * strlen($code) + $padding * 2;
    $height = $charHeight + $padding * 2;

    // 創建圖片資源
    $image = imagecreatetruecolor($width, $height);

    // 定義顏色
    $bgColor = imagecolorallocate($image, 255, 255, 255); // 白色背景
    $textColor = imagecolorallocate($image, 0, 0, 0);     // 黑色文字
    $noiseColor = imagecolorallocate($image, 100, 120, 180); // 噪點顏色

    // 填充背景
    imagefilledrectangle($image, 0, 0, $width, $height, $bgColor);

    // 添加干擾噪點
    for ($i = 0; $i < 50; $i++) {
        imagesetpixel($image, random_int(0, $width), random_int(0, $height), $noiseColor);
    }

    // 逐字符繪製驗證碼文字
    $x = $padding;
    $y = $padding;
    for ($i = 0; $i < strlen($code); $i++) {
        imagestring($image, $font, $x, $y, $code[$i], $textColor);
        $x += $charWidth;
    }

    // 輸出圖片頭部
    header('Content-Type: image/png');
    imagepng($image);
    imagedestroy($image);
}

// 生成驗證碼字符串
$captchaCode = generateCaptchaCode(6);

// 輸出驗證碼圖片
createCaptchaImage($captchaCode);
?>

4. 說明與擴展

  • 自適應寬度:代碼通過imagefontwidth動態計算單個字符寬度,乘以驗證碼字符數,再加邊距,從而讓驗證碼圖片寬度隨內容長度自動調整。

  • 字體大小:示例中採用GD內置字體5,若需更好視覺效果,可以使用imagettftext加載TrueType字體,但需要額外處理字符寬度的計算。

  • 安全性:可以在生成驗證碼後,將驗證碼字符串存儲到Session,供表單提交時驗證。

  • 美化:可以加更多噪點、曲線,或變換字體顏色,增強驗證碼防破解能力。


5. 小結

通過PHP的imagefontwidth函數,我們能準確獲得單個字符寬度,實現驗證碼圖片寬度的動態調整。這種方法簡單高效,適合生成基礎的自適應寬度圖片驗證碼。

如果需要更複雜的驗證碼效果,可以結合GD的其它繪圖函數,或者使用第三方驗證碼庫。