現在の位置: ホーム> 最新記事一覧> ImageFontWidth()が常に間違った幅を返すのはなぜですか?

ImageFontWidth()が常に間違った幅を返すのはなぜですか?

M66 2025-06-04

PHPを使用して画像を処理する場合、 ImageFontWidth()関数を使用して特定のフォントサイズの文字幅を取得し、画像内のテキストの正確なプレースホールディングを計算します。ただし、多くの開発者は厄介な問題に遭遇します。ImageFontWidth ()によって返される幅は、常に実際のディスプレイ効果と一致しないため、テキストの位置が混乱または切り捨てられます。この記事では、この問題の原因を詳細に分析し、信頼できるソリューションを提供します。

ImageFontWidth()とは何ですか?

ImageFontWidth(int $ font)は、PHP GDライブラリが提供する関数の1つであり、指定されたフォントサイズの文字のピクセル幅を取得します。 GDライブラリに組み込まれたBitMapフォントでのみ動作し、フォントサイズは通常、整数値(1〜5)です。

サンプルコード:

 $width = imagefontwidth(5);
echo "フォント幅はです:$width ピクセル";

一般的な誤解と不正行為

問題は通常、次の側面で発生します。

1.フォントタイプの誤解

ImageFontWidth()は、内蔵ビットマップフォントに対してのみ有効であり、TrueTypeフォント(TTFS)には適用されません。多くの開発者は、 imagettftext ()を使用してTTFフォントを誤ってレンダリングします。これは必然的に誤った結果につながります。

2。文字の総幅を無視します

組み込みのフォントを使用している場合でも、 ImageFontWidth()が単一の文字の幅を返すことを忘れないでください。文字列全体をレンダリングする場合は、文字列の長さを掛ける必要があります。

 $font = 5;
$text = "Hello";
$width = imagefontwidth($font) * strlen($text);

文字列にマルチバイト文字(中国語など)が含まれている場合、 Strlen()によって返される長さは不正確になり、代わりにmb_strlen()を使用する必要があります。

 $width = imagefontwidth($font) * mb_strlen($text, 'UTF-8');

3.フォントは正しくロードされません

PHPのビットマップフォントは手動でロードする必要はありませんが、カスタムフォントパスまたはシステムフォントを使用している場合、異なるレンダリング関数が混合される可能性があるため、理解エラーが発生します。

文字列幅を正しく取得する方法は?

状況1:GDビルトインビットマップフォントを使用します

ImageFontWidth()を使用して、フォント番号が1〜5の範囲であることを確認し、 strlen()またはmb_strlen()を使用します。

 $font = 3;
$text = "Welcome";
$width = imagefontwidth($font) * strlen($text);

状況2:TrueTypeフォントを使用します

TTFフォントの場合、 ImageFontWidth()は無効です。 Imagettfbbox()を使用して、指定されたフォントの下に文字列の境界ボックスを取得し、座標に従って幅を計算する必要があります。

 $fontFile = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
$fontSize = 14;
$text = "Welcome";

$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$width = abs($bbox[2] - $bbox[0]);

この例では、 $ BBOXは、テキスト境界の四隅を表す8つの要素の配列を返します。幅は、右上隅と左上隅の間の水平軸の差によって計算できます。

サンプルアプリケーション:テキストで動的に絵を描きます

$img = imagecreate(200, 50);
$bg = imagecolorallocate($img, 255, 255, 255);
$color = imagecolorallocate($img, 0, 0, 0);

$fontFile = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
$text = "Hello World";
$fontSize = 12;

$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$textWidth = abs($bbox[2] - $bbox[0]);

$x = (200 - $textWidth) / 2;
$y = 30;

imagettftext($img, $fontSize, 0, $x, $y, $color, $fontFile, $text);

header("Content-Type: image/png");
imagepng($img);
imagedestroy($img);

このようにして、TTFフォントでさえ正確な幅とセンタリング位置を取得できるようにします。

ヒント

  • ImageString()Imagettftext()を混合しないでください:ビットマップとTTFフォントにそれぞれ適しています。

  • ImageFontWidth()によって返された結果はDPI設定の影響を受けませんが、 ImageTtfbbox()は論理ピクセルを計算し、フォントファイルの影響を受けます。

  • 別のサーバーに展開されている場合は、フォントファイルパスが存在し、アクセス可能であることを確認してください。例: https://m66.net/fonts/dejavusans.ttf

要約します

ImageFontWidth()が間違った幅を返す場合、ほとんどのケースは、互換性のないフォントタイプを使用するか、文字の総数の積を無視しているためです。この関数の範囲を理解し、代わりにTTFフォントを扱うときにImagetTFBBox()を使用することは、問題を解決するための鍵です。ツールを正しく選択することによってのみ、画像を処理するときに目的の正確なレイアウトと効果を取得できます。