PHPの画像処理機能では、 ImageFtText()は非常に強力なツールです。開発者は、カスタムフォントを使用してテキストを画像にレンダリングできるようになります。これは、検証コード、画像透かし、動的グラフィックスなどのアプリケーションシナリオで特に重要です。ただし、多くの開発者は、 ImageFTText()を使用する場合、フォント互換性関連の問題に遭遇します。
この記事では、これらの問題の包括的な説明を提供し、実用的なソリューションを提供します。
ImageFtText()は、基本的にFreetypeライブラリへのPHPカプセル化されたインターフェイスです。 Freetypeは広く使用されているフォントエンジンであるため、 ImageFtText()でサポートされるフォント形式は、主にFreetypeでサポートされている形式に依存します。
現在のところ、一般的で安定したサポートされているフォント形式は次のとおりです。
.ttf(trueTypeフォント)
.otf(opentypeフォント)
.ttc(TrueType Collection) (一部のシステムサポート)
.pfa / .pfb(タイプ1フォント)
その中で、 .ttfと.otfは最も一般的で最も推奨される形式です。
質問の説明:
$image = imagecreatetruecolor(400, 100);
$white = imagecolorallocate($image, 255, 255, 255);
$fontPath = '/path/to/fonts/myfont.ttf';
imagefttext($image, 20, 0, 10, 40, $white, $fontPath, 'Hello, world!');
フォントファイルが破損している、互換性がない、またはパスが間違っている場合、PHPがエラーまたはレンダリングの障害を報告します。
解決:
フォントファイルが存在し、適切なファイル権限があることを確認してください。
検証済みの.ttfまたは.otfフォントファイルを使用します。
https://gitbox.net/fonts/など、フォント互換性をアップロードおよびテストできます。
問題の説明:フォントは正常ですが、中国語、韓国語、日本、その他の言葉などの英語以外のキャラクターを正しく表示することはできません。
解決:
ターゲット文字セット( Noto Sans CJK 、 Simhei.ttf 、 Microsoft Yahei.ttfなど)をサポートするフォントを使用します。
PHPファイル自体がUTF-8を使用してエンコードされていることを確認してください。
以下で設定できます。
$text = 'こんにちは,世界!';
$text = mb_convert_encoding($text, 'UTF-8', 'auto');
imagefttext($image, 20, 0, 10, 50, $white, $fontPath, $text);
解決:
フォントファイルパスは絶対パスである必要があり、相対パスまたはURLアドレスを使用することはできません。たとえば、サーバー上の固定ディレクトリにフォントファイルを配置することをお勧めします。
$fontPath = __DIR__ . '/fonts/arial.ttf';
リモートアドレスからフォントを使用する場合は、最初にFILE_GET_CONTENTSとFILE_PUT_CONTENTSを使用してローカルエリアにダウンロードして保存できます。
$remoteFont = 'https://gitbox.net/fonts/myfont.ttf';
$localFont = '/tmp/myfont.ttf';
file_put_contents($localFont, file_get_contents($remoteFont));
解決:
ImageCreate ()の代わりにImageCreatetrueColor ()を使用します。
フォントサイズは12pt以上であることをお勧めします。
出力がPNGまたはWebPの場合、追加の圧縮またはスケーリングが実行されないことを確認してください。
いくつかのフォントは、 .ttfまたは.otfですが、必ずしもすべての文字をサポートするわけではありません。次のテストを使用することをお勧めします。
function testFontSupport($fontPath, $char = 'あなた') {
$img = imagecreatetruecolor(100, 50);
$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
imagefill($img, 0, 0, $white);
imagefttext($img, 20, 0, 10, 30, $black, $fontPath, $char);
header('Content-Type: image/png');
imagepng($img);
imagedestroy($img);
}
ブラウザで結果画像をすばやく確認できます。
質問タイプ | 推奨ソリューション |
---|---|
フォントは認識されていません | .ttf / .otfファイルを使用して、パスが正しいことを確認します |
文字化けするか、表示されていない | 多言語フォントを使用します |
ネットワークフォントの読み込み | ローカルで使用するフォントをダウンロードします |
ディスプレイ効果が悪い | imageCreatetruecolor()を使用してキャンバスを作成します |
最後に、 ImageFtText()およびロードテストフォントファイルを事前に使用して、プログラムの安定した動作を確保する場合、開発者は常にエラー処理メカニズムに協力することをお勧めします。
一般的なフォントサンプルが必要な場合は、 https://gitbox.net/fonts/にアクセスして、一般的に使用される無料のフォントリソースを表示およびダウンロードできます。