前言
圖形驗證碼是 Web 開發中最基礎也最實用的安全機制之一。本教學專為 PHP 初學者設計,帶領你從建立畫布、分配顏色、繪製文字到輸出圖片,完整實作一個簡單的驗證碼生成器。
核心步驟解析
- 建立真彩色畫布:使用 `imagecreatetruecolor()` 建立 300×300 像素的畫布。
- 分配顏色:以 `imagecolorallocate()` 定義白色(前景)與深藍色(背景)。
- 填充背景:`imagefill()` 將整個畫布填滿背景色。
- 繪製字串:`imagestring()` 在座標 (100,120) 以字級 10 寫入「Hello,PHP」。
- 輸出圖片:送出 `Content-type: image/png` 標頭,再以 `imagepng()` 輸出二進位資料。
- 釋放資源:`imagedestroy()` 釋放記憶體,避免洩漏。
完整範例程式碼
<?php
$height = 300;
$width = 300;
// 建立背景圖
$im = imagecreatetruecolor($width, $height);
// 分配顏色
$white = imagecolorallocate($im, 255, 255, 255);
$blue = imagecolorallocate($im, 0, 0, 64);
// 繪製顏色至圖像中
imagefill($im, 0, 0, $blue);
// 繪製字串:Hello,PHP
imagestring($im, 10, 100, 120, 'Hello,PHP', $white);
// 輸出圖像,定義標頭
header('Content-type: image/png');
// 將圖像發送至瀏覽器
imagepng($im);
// 清除資源
imagedestroy($im);
?>
進階延伸建議
- 將固定字串改為隨機產生的 4~6 碼英數字元
- 加入 `imageline()` 或 `imagesetpixel()` 產生干擾線與雜點
- 使用 `imagettftext()` 搭配 TrueType 字體,實現字元傾斜、大小變化
- 將驗證碼存入 `$_SESSION` 供表單驗證使用
常見問題 FAQ
- Q: 瀏覽器顯示亂碼而非圖片?
- A: 確認 `header('Content-type: image/png')` 在任何輸出(含空白、BOM)之前送出,且腳本未輸出多餘文字。
- Q: 呼叫 `imagecreatetruecolor()` 報錯?
- A: 請檢查 `php.ini` 是否啟用 `extension=gd`(PHP 7.2+ 為 `extension=gd2`),並重啟 Web 伺服器。
總結
透過不到 20 行程式碼,你已掌握 PHP GD 庫建立圖片、繪製文字與輸出的核心流程。這是進階驗證碼、圖表生成、圖片水印等功能的基石,建議動手修改參數觀察效果,紮實 GD 繪圖基本功。