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

PHP GD 圖片繪製中英文文字完整指南:imagestring vs imagettftext 深度對比

     編輯:PHP 綜合知識

前言

在 PHP GD 圖形處理中,向圖片寫入文字是高頻需求。GD 提供了兩組核心函數:imagestring() (內建字體) 與 imagettftext() (TrueType 字體)。兩者在**中文支援、字體靈活度、文字大小、旋轉角度**等方面存在本質差異。本文將透過實戰代碼對比,幫助你選擇最適合的方案。

方案一:imagestring() - 內建字體 (僅限英文/數字)

特點

  • **無需外部字體檔**,內建 5 種固定大小字體 (1-5 號)
  • **極快**,無字體解析開銷
  • **僅支援 Latin-1 編碼字符** (英文、數字、基本符號)
  • **中文會顯示為亂碼或方塊**
  • **僅支援水平排版**,無法旋轉

代碼範例:純英文場景

<?php
// 1. 建立真彩色畫布 (300x200)
$im = imagecreatetruecolor(300, 200);

// 2. 分配顏色:紅色
$red = imagecolorallocate($im, 255, 0, 0);

// 3. 寫入英文字串
$str = "Hello, World!";
/* imagestring 參數:
   $im, $font(1-5), $x, $y, $string, $color
   座標 (x,y) 為文字左上角基準點
*/
imagestring($im, 5, 30, 60, $str, $red); 

// 4. 輸出並銷毀
header("Content-Type: image/png");
imagepng($im);
imagedestroy($im);
?>

方案二:imagettftext() - TrueType 字體 (中英通用、專業首選)

核心優勢

特性imagestring()imagettftext()
中文支援❌ 不支援✅ 完美支援 (需 UTF-8)
字體選擇僅 5 種內建任意 .ttf/.ttc 字體檔
字體大小固定 1-5 號任意點數 (pt),無上限
文字旋轉僅水平任意角度 (度數)
抗鋸齒無自動抗鋸齒,渲染品質高
效能極高較低 (需解析字體輪廓)

代碼範例:中英混排

<?php
// 1. 建立畫布
$im = imagecreatetruecolor(400, 200);
$red = imagecolorallocate($im, 255, 0, 0);

// 2. 【關鍵】確保字串為 UTF-8 編碼
// 若 PHP 檔案已儲存為 UTF-8,直接賦值即可
$str = "北京,你好!Hello, World!";

/* 
   若檔案為 GB2312/Big5 編碼,必須轉換:
   $str = iconv('GB2312', 'UTF-8', '北京,你好!Hello, World!');
*/

// 3. 字體路徑 (需確保檔案存在且可讀)
$fontPath = __DIR__ . '/fonts/msjh.ttc'; // 微軟正黑體

// 4. 繪製文字
/* imagettftext 參數:
   $im, $size(pt), $angle(度), $x, $y, $color, $fontfile, $text
   座標 (x,y) 為文字**基準線左端點** (非左上角)
   $angle: 0=水平,正值=逆時針旋轉
*/
imagettftext($im, 24, 0, 20, 80, $red, $fontPath, $str);

// 5. 輸出
header("Content-Type: image/png");
imagepng($im);
imagedestroy($im);
?>

實戰進階:解決常見痛點

1. 文字自動換行 (GD 無內建功能)

需自行計算字寬,拆分字串。參考邏輯:

function imagettftext_wrap($im, $size, $angle, $x, $y, $color, $font, $text, $maxWidth, $lineHeight) {
    $words = preg_split('/(?<=.)/u', $text); // 按字符分割 (支援中文)
    $line = '';
    $lines = [];
    foreach ($words as $char) {
        $testLine = $line . $char;
        $bbox = imagettfbbox($size, $angle, $font, $testLine);
        $width = $bbox[2] - $bbox[0];
        if ($width > $maxWidth && $line !== '') {
            $lines[] = $line;
            $line = $char;
        } else {
            $line = $testLine;
        }
    }
    $lines[] = $line;
    
    foreach ($lines as $i => $line) {
        $lineY = $y + $i * $lineHeight;
        imagettftext($im, $size, $angle, $x, $lineY, $color, $font, $line);
    }
    return count($lines);
}

2. 文字對齊 (置中、靠右)

利用 imagettfbbox() 獲取文字邊界框,計算實際寬高,反推起始座標:

$bbox = imagettfbbox($size, $angle, $font, $text);
$textWidth = $bbox[2] - $bbox[0];
$textHeight = $bbox[1] - $bbox[7];

// 置中對齊
$x = ($imgWidth - $textWidth) / 2;
$y = ($imgHeight + $textHeight) / 2; // 近似垂直置中
imagettftext($im, $size, $angle, $x, $y, $color, $font, $text);

3. 陰影/描邊效果

$shadowColor = imagecolorallocate($im, 0, 0, 0); // 黑色陰影
$offset = 2;
// 先畫陰影 (偏移 2px)
imagettftext($im, $size, $angle, $x+$offset, $y+$offset, $shadowColor, $font, $text);
// 再畫主文字
imagettftext($im, $size, $angle, $x, $y, $color, $font, $text);

字體檔案獲取與授權提醒

  • 微軟正黑體 (`msjh.ttc`):Windows 系統內建,商業使用需確認授權。
  • 思源黑體 (Source Han Sans) - 開源免費商用 (SIL Open Font License),強烈推薦。
    下載:GitHub Release
  • 文泉驛微米黑 (WenQuanYi Micro Hei) - 開源免費,Linux 常見。
  • 將字體檔放入專案目錄 (如 `/fonts/`),使用相對路徑 `__DIR__ . '/fonts/SourceHanSansTC-Regular.otf'`。

總結與選型建議

場景推薦函數理由
純英文/數字/簡單驗證碼imagestring()零依賴、極速、代碼極簡
含中文、需自訂字體、商業海報、水印imagettftext()專業渲染、完整中文支援、無限擴展性
高性能、高並發圖片生成考慮 Swoole + GD 或 ImageMagickGD 為同步阻塞,高併發下易成瓶頸

**結論**:現代 Web 開發中,**imagettftext() 應為預設首選**。除非極度簡單的純英文場景,否則其靈活度與渲染品質遠超 `imagestring()`。請務必採用 **UTF-8 編碼** 專案與 **開源授權字體**,構建健壯的圖文生成服務。

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