PHPでは、 ImageFontWidth関数を使用して、組み込みフォントの単一文字幅を取得します。デフォルトのフォントコレクションの文字幅を返し、GDライブラリを使用してテキストを描画するときにテキストの幅とレイアウトを簡単に計算できます。ただし、デフォルトのImageFontWidthは、固定幅の組み込みフォントのみをサポートし、国際的なキャラクター(中国語、日本、韓国など)のサポートは限られており、実際の幅を正確に反映することはできません。
この記事では、拡張またはカスタマイズを通じてImageFontWidthの機能を強化し、より多くの国際的なキャラクター幅をサポートし、それによりテキストレンダリングの精度と美学を改善する方法について説明します。
ImageFontWidth(int $ font):int
GDビルトインフォント番号のみを受け入れる(1〜5)
キャラクターの実際のコンテンツを無視して、固定幅を返します
マルチバイト文字の幅計算はサポートされておらず、半幅および全幅の文字を区別することはできません。
例えば:
<?php
$font = 5;
$width = imagefontwidth($font);
echo "Font $font width is $width pixels.";
?>
キャラクターが英語であろうと中国語であろうと、 ImageFontWidthによって返される幅は同じであり、レイアウトの混乱を引き起こします。
より国際的なキャラクターの幅をサポートするには、 ImageFontWidthの純粋な依存性をバイパスする必要があり、次のソリューションを考慮することができます。
ImagetTFBBoxは、指定されたTrueTypeフォントファイルの文字列の境界ボックスサイズを測定できます。多言語テキストに適しており、マルチバイトエンコーディングをサポートしています。
例:
<?php
$fontFile = 'm66.net/fonts/YourFont.ttf'; // カスタムフォントパス
$text = "こんにちは,world!";
$fontSize = 16;
$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$width = abs($bbox[2] - $bbox[0]);
echo "Text width is $width pixels.";
?>
これにより、テキストの幅を正確に取得し、 ImageFontWidthの制限を回避できます。
ImageFontWidthコールインターフェイスと互換性がある必要がある場合は、文字エンコード範囲に従って対応する幅を内部的に返すカスタム関数を作成できます。
例:
<?php
function extendedImageFontWidth(int $font, string $char): int {
// 内蔵フォントの標準幅
$baseWidth = imagefontwidth($font);
// Unicode全幅文字を決定するためのエンコード
$ord = mb_ord($char, 'UTF-8');
// 一般的な中国語、日本語、韓国のキャラクターは大まかに範囲です
if (($ord >= 0x4E00 && $ord <= 0x9FFF) || // CJK Unified Ideographs
($ord >= 0x3000 && $ord <= 0x303F) || // CJK Symbols and Punctuation
($ord >= 0xFF00 && $ord <= 0xFFEF)) { // Halfwidth and Fullwidth Forms
return $baseWidth * 2; // 全幅の文字幅が2回であると仮定します
}
return $baseWidth; // 半幅の文字
}
// 使用例
$font = 5;
$char1 = "A";
$char2 = "あなた";
echo extendedImageFontWidth($font, $char1) . "\n"; // たとえば、返品 9
echo extendedImageFontWidth($font, $char2) . "\n"; // 戻る 18
?>
この方法は十分に正確ではありませんが、シンプルさと特定の国際的なサポートの両方を考慮しています。
上記のマッピングスキームに基づいて、テキストの段落全体の幅を正確に計算することができます。
<?php
function extendedImageFontWidth(int $font, string $char): int {
$baseWidth = imagefontwidth($font);
$ord = mb_ord($char, 'UTF-8');
if (($ord >= 0x4E00 && $ord <= 0x9FFF) ||
($ord >= 0x3000 && $ord <= 0x303F) ||
($ord >= 0xFF00 && $ord <= 0xFFEF)) {
return $baseWidth * 2;
}
return $baseWidth;
}
function getTextWidth(int $font, string $text): int {
$width = 0;
$len = mb_strlen($text, 'UTF-8');
for ($i = 0; $i < $len; $i++) {
$char = mb_substr($text, $i, 1, 'UTF-8');
$width += extendedImageFontWidth($font, $char);
}
return $width;
}
// 例
$font = 5;
$text = "Hello,世界!";
echo "Text width: " . getTextWidth($font, $text) . " pixels.";
?>
ImageFontWidthは、固定された幅の組み込みフォントに適しており、マルチバイトの国際文字の正確な幅をサポートできません。
imagettfbboxとカスタムロジックを組み合わせて、より正確なフォント幅情報を取得し、多言語サポートを取得できます。
文字幅マッピングを通じて、既存のコードを拡張して、中国語と日本の中国語と日本の文字の幅の推定を実現できます。これは、単純なシナリオに適しています。
実際のアプリケーションでは、TrueTypeフォントとImagetTFBBoxを使用して、文字列の幅を測定してテキストレンダリング効果を改善することをお勧めします。