首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP GD 圖形繪製實戰大全:從基礎圖元到驗證碼、水印、3D 效果

     編輯:PHP 綜合知識

前言

PHP GD 擴展提供強大的影像處理能力,本文通過六個完整範例,由淺入深展示:環境檢測、基本繪圖流程、核心函數速查、藍底白線、陰陽圖、3D 扇形圖、簡易/進階驗證碼、圖片水印與縮圖生成。

一、 環境檢測與基本流程

if (!function_exists('imagecreate')) {
    die('本伺服器不支援 GD 模組');
}

若不支援:下載 php_gd2.dll、修改 php.ini 啟用 extension=gd、重啟 Web 伺服器。

四步驟繪圖流程

  1. 建立畫布:$img = imagecreatetruecolor($w, $h)(建議用 TrueColor)
  2. 分配顏色:$color = imagecolorallocate($img, R, G, B)
  3. 繪製圖元:線條、文字、幾何形狀、填充等
  4. 輸出/儲存:header('Content-Type: image/png'); imagepng($img) 或 imagepng($img, 'file.png')
  5. 釋放資源:imagedestroy($img)

二、 核心函數速查表

函數用途關鍵參數
imagecreatetruecolor建立真彩色畫布寬、高
imagecolorallocate分配顏色識別碼畫布、R、G、B (0-255)
imagefill區域填充畫布、起始座標、顏色
imageline畫線段畫布、兩端座標、顏色
imagestring畫內建字體文字畫布、字體號(1-5)、座標、字串、顏色
imagettftext畫 TrueType 字體文字畫布、大小、角度、座標、顏色、字體檔、字串
imagefilledellipse畫實心橢圓畫布、中心座標、寬高、顏色
imagefilledarc畫實心弧形/扇形畫布、中心、寬高、起止角度、顏色、模式
imagesetthickness設定線條粗細畫布、像素
imagesetpixel畫單一像素畫布、座標、顏色
imagecopyresized複製並縮放目標、來源、座標、寬高

三、 範例集錦

範例 1:藍底白色交叉線 (35×35)

$img = imagecreate(35, 35);
$white = imagecolorallocate($img, 255, 255, 255);
$blue  = imagecolorallocate($img, 0, 0, 108);
imagefill($img, 0, 0, $blue);
imagesetthickness($img, 3);
imageline($img, 0, 0, 35, 35, $white);
imageline($img, 35, 0, 0, 35, $white);
header('Content-Type: image/png');
imagepng($img);
imagedestroy($img);

範例 2:陰陽圖 (400×400)

運用 imagefilledarc 繪製大圓與半圓,imagefilledellipse 繪製魚眼,展示圖層疊加技巧。

範例 3:3D 立體扇形圖

核心技巧:for ($i = $h/2+20; $i > $h/2; $i--) 向上疊加多層偏暗色扇形製造厚度感,最後在頂層繪製高亮色扇形。

範例 4/5:驗證碼進化史

特性簡易版 (65×20)進階版 (600×100)
字元來源英數混合 62 字同左
字體內建 5 號字體TTF (Arial) + 隨機旋轉 ±120°
顏色隨機 RGB預設調色盤 + 隨機挑選
干擾隨機像素點密集像素點 (面積/100)
Session 儲存$_SESSION['cjjer']同左

關鍵代碼片段 (進階版):

$fontSize = floor($height / 2);
for ($i = 0; $i < $strSize; $i++) {
    $x = $fontSize + $i * $width / ($strSize + 1);
    $y = $height / 2;
    $angle = rand(-120, 120);
    $color = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
    imagettftext($img, $fontSize, $angle, $x, $y, $color, $fontFile, $char);
}

範例 6:圖片水印 + 縮圖 (JPEG 輸出)

$src = imagecreatefromjpeg('my.jpg');
$watermark = '我是帥哥,你是MM麼?';
$font = __DIR__ . '/simsun.ttc';
$text = iconv('GB2312', 'UTF-8', $watermark);
$red = imagecolorallocate($src, 111, 0, 0);
imagettftext($src, 30, 25, $w/5, $h/2, $red, $font, $text);

// 縮圖 50%
$dst = imagecreatetruecolor($w*0.5, $h*0.5);
imagecopyresized($dst, $src, 0,0,0,0, $w*0.5, $h*0.5, $w, $h);
imagejpeg($dst, 'my_zoom.jpg', 85);
imagedestroy($src); imagedestroy($dst);

格式選擇建議:相片類 → JPEG (品質 80-90);截圖/圖示 → PNG;動畫 → GIF。

四、 常見坑位與最佳實踐

  • 中文亂碼:必須 iconv 轉 UTF-8 並載入中文字體 (如 simsun.ttc)
  • 記憶體耗盡:大圖處理前調大 memory_limit,及時 imagedestroy
  • 座標系統:左上角 (0,0),X 向右、Y 向下
  • TrueColor vs Palette新專案一律用 imagecreatetruecolor,支援 Alpha 透明與 1670 萬色
  • 輸出前送 Header:header('Content-Type: image/png') 必須在任何輸出前

五、 結語

GD 雖非 ImageMagick 那般強大,但零依賴、隨 PHP 內建、API 穩定,足以應對驗證碼、圖表、水印、縮圖等 90% 的 Web 圖形需求。掌握本文六大範例核心邏輯,即可靈活組合解決實際業務場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved