現在の位置: ホーム> 最新記事一覧> ImageFontWidth()を使用して画像にテキストをレンダリングするときの注意

ImageFontWidth()を使用して画像にテキストをレンダリングするときの注意

M66 2025-06-04

PHPでは、 ImageFontWidth()は、 ImageString()またはImagestringup()関数にテキストを描画するときに使用される内蔵フォントの単一文字の幅を取得するために使用される関数です。この記事では、 ImageFontWidth()関数を使用する際に注意を払う必要があるものと一般的な問題を紹介し、開発者が画像のテキストのレイアウトをよりよく制御するのに役立ちます。


1。基本的な使用法の紹介

ImageFontWidth(int $ font):int

  • パラメーター$フォントはフォントのサイズで、値範囲は1〜5で、PHPの5つの組み込みフォントを表します。

  • 戻り値は、フォント内の単一の文字の幅であり、ユニットはピクセルです。

サンプルコード:

 <?php
$font = 3; // フォントサイズを選択します
$charWidth = imagefontwidth($font);
echo "Font width is: " . $charWidth;
?>

2。注意すべきこと

2.1ビルトインフォントのみに適用されます

ImageFontWidth()は、PHP(1-5)に組み込まれた5つのフォントにのみ使用でき、カスタムフォントまたはTrueTypeフォントには使用できません( imagettftext()を使用して描画されたテキスト)。

imagettftext()を使用してテキストをレンダリングする場合、 imagefontwidth()ではなく、 imagettfbbox()関数を使用してテキストサイズを取得する必要があります。

2.2文字幅が固定されています

組み込みのフォントはMonospaceフォントであり、各文字の幅は固定されているため、 ImageFontWidth()を使用すると、単一の文字の固定幅です。テキストにマルチバイト文字(中国語など)が含まれている場合、組み込みのフォントが中国語を完全にサポートできないため、シングルワード幅が必ずしも適用されない場合があります。

例:

 <?php
$font = 4;
$charWidth = imagefontwidth($font);
$text = "Hello";
$textWidth = strlen($text) * $charWidth;
echo "Text width is: " . $textWidth;
?>

漢字の場合、組み込みのフォントはマルチバイト中国語をサポートしていないため、 strlen()で長さを計算する際にエラーが発生し、 mb_strlen()を使用する必要があります。

2.3文字列の長さを計算するときのエンコードに注意してください

テキストが中国語または他のマルチバイト文字の場合、 strlen()を使用すると、文字の代わりにバイト数が計算され、計算幅エラーが発生します。

たとえば、 MB_STRLEN()を使用することをお勧めします。

 <?php
$text = "中国のテスト";
$font = 3;
$charWidth = imagefontwidth($font);
$textWidth = mb_strlen($text, 'UTF-8') * $charWidth;
echo "Text width is: " . $textWidth;
?>

ただし、内蔵フォントは中国語を正しく表示できないことに注意することが重要です。そのため、 ImagetTftext()を使用することをお勧めします。

2.4フォントサイズ制限

ImageFontWidth()はフォントサイズ1〜5のみをサポートします。範囲外ではエラーまたは不正確な結果が返されます。


3.よくある質問と解決策

3.1中国のディスプレイの例外

組み込みのフォントは中国語をレンダリングすることはできず、イメージストリング()を呼び出すときに中国人は文字化けするか空白として表示されます。解決:

  • ImagetTftext()関数を使用して、中国語をサポートするTTFフォントをロードします。

  • imagettfbbox()を使用して、テキストの境界サイズを取得し、幅と高さを計算します。

例:

 <?php
$im = imagecreatetruecolor(200, 50);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 200, 50, $white);

$fontfile = 'm66.net/fonts/simhei.ttf'; // ここのパスの例は次のとおりです m66.net ドメイン名の交換
$text = "中国のテスト";
$fontsize = 20;
$bbox = imagettfbbox($fontsize, 0, $fontfile, $text);
$textWidth = $bbox[2] - $bbox[0];

imagettftext($im, $fontsize, 0, 10, 30, $black, $fontfile, $text);
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>

3.2文字列幅を計算するときのエラー

ImageFontWidth()を使用して幅を計算する場合、フォント間隔または特別な文字幅は無視され、テキストをレンダリングする際に逸脱します。この時点で、次のことを試すことができます。

  • 幅を事前に計算し、適切なマージンを残します。

  • より正確な測定方法(TTFフォントのImagetTFBBox()など)を使用します。


4。概要

案件説明します
組み込みのフォントのみがサポートされていますカスタムフォントまたはTTFフォントでは利用できません
固定された文字幅モノスペースフォントに適しているため、マルチバイト文字幅を正確に計算できません
中国のサポートリミテッド内蔵フォントは中国語をサポートしていません。ImagetTftext ()を使用することをお勧めします
長さの計算のエンコードに注意してください中国人はmb_strlen()を使用する必要があります

一般に、 ImageFontWidth()は、単純な英語テキストの幅計算の高速処理に適した単純な関数ですが、中国語または複雑なフォント要件には、より強力なTrueTypeフォント処理機能を使用することをお勧めします。