在PHP 圖像處理擴展GD 庫中,繪製文本是常見需求。通常我們使用imagestring()或imagettftext()來繪製文字,但這些函數在對齊和排版上較為簡單,靈活度有限。如果想要在像素級別精確控製文字位置,尤其是自定義對齊方式,就可以結合imagefontwidth()和imagesetpixel()來實現更細粒度的文本繪製和排版。
本文將介紹這兩個函數的作用,以及如何利用它們配合實現手動對齊文本繪製。
imagefontwidth()函數用於獲取指定內置字體中一個字符的寬度(單位:像素)。 GD 庫自帶幾種內置字體(1~5),每種字體的字符寬度和高度固定。
int imagefontwidth(int $font);
參數$font :字體大小,範圍1 至5。
返回值:該字體單個字符的寬度(像素)。
例如:
$font = 3;
$charWidth = imagefontwidth($font);
echo "字體寬度為 $charWidth 像素";
通過這個寬度,可以估算一行文字繪製時所需的像素長度,進而調整對齊。
imagesetpixel()函數用於在指定的圖像資源上設置單個像素的顏色值。
bool imagesetpixel(resource $image, int $x, int $y, int $color);
$image :圖像資源。
$x, $y :像素點的坐標。
$color :顏色索引或RGB 顏色。
這意味著我們可以通過逐像素操作來自定義文字的位置,甚至進行微調,實現更精確的文本排版。
通常我們繪製文本時,只能按字體大小和文字長度粗略估計整體位置,比如居中、左對齊或右對齊。但當需要更細緻的調整(比如微調單個字符位置、錯落排列、對齊特殊圖形時), imagefontwidth()和imagesetpixel()就派上用場了。
示例思路:
通過imagefontwidth()得到字體寬度,計算整行文本的像素寬度。
根據需求(比如居中對齊),計算文本起始點的X 坐標。
使用循環遍歷字符串中每個字符,逐個繪製:
利用imagestring()先繪製字符。
或者利用imagesetpixel()對字符進行微調,比如添加額外像素調整位置。
通過對單個像素的操作,實現細緻的位移和對齊效果。
以下示例中,演示如何手動計算文本繪製起點,實現居中對齊,並用imagesetpixel()對文字邊緣像素微調,強化文本視覺效果。
<?php
// 創建一個 300x100 的圖像
$img = imagecreatetruecolor(300, 100);
// 設置背景顏色(白色)
$white = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $white);
// 設置文本顏色(黑色)
$black = imagecolorallocate($img, 0, 0, 0);
$text = "Hello GD!";
$font = 3; // 內置字體
// 獲取單字符寬度和高度
$charWidth = imagefontwidth($font);
$charHeight = imagefontheight($font);
// 計算文本寬度
$textWidth = strlen($text) * $charWidth;
// 計算水平居中起點 X 坐標
$startX = (imagesx($img) - $textWidth) / 2;
$startY = (imagesy($img) - $charHeight) / 2;
// 手動逐字繪製,實現微調(如錯開每個字一個像素)
for ($i = 0; $i < strlen($text); $i++) {
$char = $text[$i];
// 每個字符起始位置,增加 Y 軸錯落偏移
$x = $startX + $i * $charWidth;
$y = $startY + ($i % 2); // 奇偶錯開 1 像素
// 繪製字符
imagestring($img, $font, $x, $y, $char, $black);
// 額外微調:用 imagesetpixel() 給字符右下角加一個像素點,增加視覺效果
imagesetpixel($img, $x + $charWidth - 1, $y + $charHeight - 1, $black);
}
// 輸出圖像
header("Content-Type: image/png");
imagepng($img);
imagedestroy($img);
?>
imagefontwidth()是了解內置字體寬度,計算文本長度和位置的關鍵函數。
imagesetpixel()可以在繪製完成後做微調或添加點綴,實現更靈活的文本視覺效果。
結合兩者,可以通過逐字符繪製和逐像素操作,精確控製文本排版,滿足定制化需求。
此技巧尤其適合對齊要求嚴格、排版複雜的圖像文字渲染場景。