在PHP 中處理圖像時,常常會用到GD 庫提供的各種函數來繪製文字。 imagefontwidth()是其中一個用於獲取內置字體寬度的函數。然而,很多開發者會發現,當嘗試使用TrueType 字體時, imagefontwidth()函數無法正常工作。本文將深入解析這一現象背後的原因。
imagefontwidth()是PHP GD 庫中的一個函數,作用是返回指定內置字體的字符寬度。它的函數原型如下:
imagefontwidth(int $font): int
參數$font是一個整數,代表內置字體的編號(1 到5)。這個函數僅支持GD 庫預定義的內置字體。
PHP GD 庫支持兩種主要的字體繪製方式:
內置字體:通過GD 庫自帶的位圖字體繪製,這些字體編號固定(1 到5),體積小,速度快,但樣式有限。
TrueType 字體(TTF) :通過imagettftext()等函數支持,可使用外部的.ttf字體文件,支持更多樣式和更高質量的文本渲染。
imagefontwidth()函數設計之初,只針對內置字體的固定寬度做查詢。它的實現邏輯基於預定義的字體數據,而不是動態解析字體文件。具體原因如下:
內置字體是固定的位圖字體<br> 內置字體的字符寬度是預定義且固定的, imagefontwidth()可以直接返回對應的寬度值
TrueType 字體需要動態解析
TrueType 字體文件包含複雜的矢量數據,字符寬度依賴字體文件中的度量信息,且不同字符寬度可能不一樣(比例字體)。 imagefontwidth()並不具備解析TTF 文件的能力。
功能定位不同
imagefontwidth()是為內置字體設計的輔助函數,而處理TTF 字體寬度的任務,通常由imagettfbbox()這類函數完成,它可以返回文字的邊界框,從而計算出字符串的實際寬度和高度。
對於TrueType 字體,推薦使用imagettfbbox()函數:
<?php
$fontFile = 'm66.net/fonts/arial.ttf'; // 請確保字體文件路徑正確
$fontSize = 12;
$text = "Hello, world!";
// 獲取文本邊界框
$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
// 計算寬度
$width = abs($bbox[4] - $bbox[0]);
echo "文字寬度為: " . $width . " 像素";
?>
imagettfbbox()返回一個包含8 個元素的數組,分別是文本四個角點的坐標,通過計算橫向坐標差值即可得到文字寬度。
imagefontwidth()只能用於GD 內置字體,不能處理TrueType 字體。
TrueType 字體寬度計算需要藉助imagettfbbox()函數。
理解這兩者的差異,有助於正確使用GD 庫實現高質量文字繪製。