在用PHP 創建圖片水印時,我們常常希望文字能夠精準地出現在圖片的特定位置,比如右下角或中心位置。但由於字體的大小和每個字符寬度的不同,計算水印的位置往往變得麻煩。幸運的是,PHP 的imagefontwidth()函數為我們解決了這個問題,尤其在使用內置字體時,它能幫助我們精確計算文字寬度,從而實現文字的精確定位。
imagefontwidth()是PHP 的GD 庫函數之一,它用於返回指定字體編號中每個字符的像素寬度。它的語法如下:
int imagefontwidth(int $font);
這個函數僅適用於GD 庫內置的字體,如1到5 。如果你使用的是imagettftext()加載的TTF 字體,請改用imagettfbbox()來計算尺寸。
在給圖片加文字水印時,我們需要明確水印文字的寬度和高度,從而確定其起始坐標。例如,如果你想讓水印顯示在右下角,需要知道水印文字的寬度,以便從圖片右邊減去它的寬度作為X 坐標。
但很多人直接用字符串長度作為寬度參考,這是不准確的。每個字體的字符寬度可能不同,甚至同一個字體中,不同字符寬度也可能不同(尤其是等寬字體與變寬字體)。
來看一個具體的例子,我們要在一張圖片的右下角添加一段文字:“版權所有m66.net”。
<?php
// 加載圖片
$image = imagecreatefromjpeg('background.jpg');
// 設置字體編號和文字
$font = 4; // 內置字體編號 1-5
$text = '版權所有 m66.net';
// 獲取文字寬度和高度
$textWidth = imagefontwidth($font) * strlen($text);
$textHeight = imagefontheight($font);
// 獲取圖片尺寸
$imageWidth = imagesx($image);
$imageHeight = imagesy($image);
// 設置文字顏色(白色)
$textColor = imagecolorallocate($image, 255, 255, 255);
// 計算文字左上角坐標(右下角偏移10像素)
$x = $imageWidth - $textWidth - 10;
$y = $imageHeight - $textHeight - 10;
// 寫入文字
imagestring($image, $font, $x, $y, $text, $textColor);
// 輸出圖像
header('Content-Type: image/jpeg');
imagejpeg($image);
// 銷毀資源
imagedestroy($image);
?>
在這段代碼中, imagefontwidth($font)返回每個字符的寬度, strlen($text)返回字符數,兩者相乘即得到整段文字的像素寬度。再用圖片寬度減去文字寬度和邊距,我們就得到了精確的右下角坐標。
imagefontwidth()是一個簡單但非常有用的工具,它可以讓你在處理使用GD 內置字體的水印定位時更加精確。配合imagefontheight() ,你可以對任何一個位置(左上、右上、居中等)進行精準控制。對於需要更複雜文字渲染的情況,如使用自定義TTF 字體,請考慮使用imagettfbbox()做更複雜的邊界計算。
利用imagefontwidth()和imagefontheight() ,讓我們給圖片添加水印也變得精確而高效。