我注意到使用重音字元(例如法文!!)
像這樣
strlen("câble" * imagefontwidth(FONTSIZE));
這個指令會給出一個比實際長度大的字串長度
所以你必須先將字串通過 utf8 解碼
strlen(utf8_decode("câble") * imagefontwidth(FONTSIZE));
就這樣 (對不起我的英文!)
(PHP 4, PHP 5, PHP 7, PHP 8)
imagefontwidth — 取得字型寬度
返回字型的像素寬度。
範例 #1 在內建字型上使用 imagefontwidth()
<?php
echo '字型寬度:' . imagefontwidth(4);
?>
以上範例會輸出類似如下的結果
Font width: 8
範例 #2 將 imagefontwidth() 與 imageloadfont() 一起使用
<?php
// 載入 .gdf 字型
$font = imageloadfont('anonymous.gdf');
echo '字型寬度:' . imagefontwidth($font);
?>
以上範例會輸出類似如下的結果
Font width: 23
我注意到使用重音字元(例如法文!!)
像這樣
strlen("câble" * imagefontwidth(FONTSIZE));
這個指令會給出一個比實際長度大的字串長度
所以你必須先將字串通過 utf8 解碼
strlen(utf8_decode("câble") * imagefontwidth(FONTSIZE));
就這樣 (對不起我的英文!)
這個程式庫函式對於只包含文字的可變大小影像非常有用,例如我用來輸出錯誤訊息的函式,這些錯誤訊息會累積並導致我的縮圖產生器發生嚴重錯誤
<?php
function errimg($error) {
// $error 是一個錯誤訊息的陣列,每個訊息佔一行
// 初始化
$font_size = 2;
$text_width = imagefontwidth($font_size);
$text_height = imagefontheight($font_size);
$width = 0;
// 圖片的高度將會是 $error 中項目的數量
$height = count($error);
// 這會取得最長字串的長度,以字元為單位來決定
// 輸出圖片的寬度
for($x = 0; $x < count($error); $x++) {
if(strlen($error[$x]) > $width) {
$width = strlen($error[$x]);
}
}
// 接下來我們將高度和寬度轉換為像素值
$width = $width * $text_width;
$height = $height * $text_height;
// 建立圖片,其尺寸足以容納文字,外加兩列和
// 兩欄作為邊框
$im = imagecreatetruecolor($width + ( 2 * $text_width ),
$height + ( 2 * $text_height ) );
if($im) {
// 圖片建立成功
$text_color = imagecolorallocate($im, 233, 14, 91);
// 這個迴圈將錯誤訊息輸出到圖片上
for($x = 0; $x < count($error); $x++) {
// imagestring(圖片, 字型, x, y, 訊息, 顏色);
imagestring($im, $font_size, $text_width,
$text_height + $x * $text_height, $error[$x],
$text_color);
}
// 現在,使用您最喜歡的 image* 函式來渲染您的圖片
// (例如 imagejpeg)
out($im, array(), $error);
} else {
// 圖片建立失敗,所以直接將陣列連同額外錯誤一起傾印
$error[] = "是否已安裝 GD?";
die(var_dump($error));
}
}
?>
此函數預期傳入一個錯誤訊息陣列,然後輸出一個包含該陣列內容的圖片。如果您的程式碼包含在 HTML 頁面中,而圖片無法正確渲染時會顯示重新呈現的文字,這特別有用。
此函數會以圖片形式顯示陣列,索引 0 在最上方,最高的索引在最下方。
您必須自行撰寫 out() 函式,請參考 imagejpeg、imagepng 等,以了解如何撰寫出色的輸出函式。
一個在特定情況下比 ImageFontWidth 更快的函式
<?
function ImageFontWidthByFilename($filename)
{
$handle = @fopen($font_locations[$i],"r");
$c_wid = @fread($handle,11);
@fclose($handle);
return(ord($c_wid{8})+ord($c_wid{9})+ord($c_wid{10})+ord($c_wid{11}));
}
echo "./font.gdf 的寬度是 ".ImageFontWidthByFilename("./font.gdf")." 像素";
?>
讀取 5 種不同字型的寬度 500 次,ImageFontWidth 平均每次讀取 5 次需要約 0.004 秒,而我的函式每次讀取 5 次則需要約 0.0003 秒。
原因在於 ImageFontWidth 需要呼叫 ImageLoadFont,但如果因為某些原因您不需要載入字型,只需要找出寬度,那麼這個函式就是為您準備的 :-)
更多此類奇蹟請見 http://puremango.co.uk