現在の位置: ホーム> 最新記事一覧> 代替:ImageFontWidth関数をImageTtfbbox()に置き換えて、より正確なテキスト幅を取得するにはどうすればよいですか?

代替:ImageFontWidth関数をImageTtfbbox()に置き換えて、より正確なテキスト幅を取得するにはどうすればよいですか?

M66 2025-06-11

PHPで画像テキストを処理するときは、テキストの幅を取得してレイアウトを簡単に入手してポジショニングする必要があることがよくあります。従来、多くの開発者はImageFontWidth()関数を使用して、組み込みのフォントの文字幅を取得します。ただし、 ImageFontWidth()は組み込みのフォント(および固定サイズ)のみを処理できるため、特にTrueTypeフォントを使用する場合は、その精度と柔軟性は限られています。

この記事では、ImageFontWidth()imagettfbbox()関数に置き換える方法を紹介し、より正確なテキスト幅測定を実現します。これは、特にTTFフォントを自由に使用するシナリオに適しています。


1。imageFontWidth ()の制限

ImageFontWidth()関数は、内蔵フォント(1〜5)のサイズのみを受け入れ、指定されたフォント(ピクセル)の文字の幅を返します。ただし、この関数は、文字列の全体的な幅を測定することも、カスタムフォントサイズとフォントファイルをサポートすることもできません。

 <?php
// 従来の使用,組み込みのフォントサイズを取得します3キャラクターの幅
$charWidth = imagefontwidth(3);
echo "文字幅: $charWidth";
?>

この方法では、文字列またはカスタムフォントの幅を正確に取得しません。


2。imagettfbbox ()を使用して、より正確なテキスト幅を取得します

imagettfbbox()は、TrueTypeフォント用のPHPによって提供される関数です。画像上の指定されたテキストの境界ボックス座標を表す配列を返します。これらの座標を計算することにより、テキストの幅と高さを取得できます。

関数プロトタイプ:

 array imagettfbbox(float $size, float $angle, string $fontfile, string $text)
  • $サイズ:フォントサイズ

  • $角:角度(通常0)

  • $ fontfile :fontファイルパス(.ttf)

  • $テキスト:測定する必要があるテキスト

返品値:

テキスト境界ボックスの4つの頂点を表す8つの整数の配列を返します。

 0 => lower left X
1 => lower left Y
2 => lower right X
3 => lower right Y
4 => upper right X
5 => upper right Y
6 => upper left X
7 => upper left Y

3。テキスト幅を計算するためのサンプルコード

次の例は、ImageFontWidth ()の代わりにImagetTfbbox ()を使用してテキスト幅を正確に測定する方法を示しています。

 <?php
// 文字内容
$text = "Hello, 世界!";

// フォントサイズ
$fontSize = 16;

// 角度
$angle = 0;

// フォントファイルパス(フォントファイルがサーバー上にあると仮定します)
$fontFile = 'm66.net/fonts/arial.ttf';

// テキスト境界ボックスアレイを取得します
$bbox = imagettfbbox($fontSize, $angle, $fontFile, $text);

// 幅を計算します
// 右下隅X - 左下隅X
$textWidth = abs($bbox[2] - $bbox[0]);

echo "テキスト幅はです: " . $textWidth . " ピクセル";
?>

4.テキスト幅に基づいた動的センタリングディスプレイの例

300pxの幅のキャンバスにテキストを描画する必要があるとします。最初にimagettfbbox()を使用してテキスト幅を取得し、次に開始点を計算できます。

 <?php
// キャンバスを作成します
$imgWidth = 300;
$imgHeight = 50;
$image = imagecreatetruecolor($imgWidth, $imgHeight);

// カラー定義
$bgColor = imagecolorallocate($image, 255, 255, 255);
$textColor = imagecolorallocate($image, 0, 0, 0);

// 背景を埋めます
imagefill($image, 0, 0, $bgColor);

// テキストとフォントパラメーター
$text = "Hello, 世界!";
$fontSize = 20;
$angle = 0;
$fontFile = 'm66.net/fonts/arial.ttf';

// テキスト幅を取得します
$bbox = imagettfbbox($fontSize, $angle, $fontFile, $text);
$textWidth = abs($bbox[2] - $bbox[0]);
$textHeight = abs($bbox[5] - $bbox[1]);

// 計算しますXシャフトの出発点,センターレベルを達成します
$x = ($imgWidth - $textWidth) / 2;

// 計算しますYシャフトの出発点,垂直センタリングを実現します(知らせ imagettftext ベースラインに基づいています)
$y = ($imgHeight + $textHeight) / 2;

// テキストを描きます
imagettftext($image, $fontSize, $angle, $x, $y, $textColor, $fontFile, $text);

// 出力画像
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>

5。概要

  • ImageFontWidth()は、内蔵フォントにのみ適しており、単純な機能があります。

  • imagettfbbox()は、TTFフォントのテキスト境界サイズを正確に取得し、テキスト幅をより正確に測定できます。

  • Imagettfbbox()を使用すると、特にカスタムフォントや複雑なテキストに適した、より柔軟なテキストポジショニングとタイポグラフィの要件を実現できます。

この記事で紹介した例を使用して、 ImageFontWidth()ImageTtfbbox()に簡単に置き換えて、画像ワードプロセッシングの精度と柔軟性を向上させることができます。