PHPで画像の透かしを作成するとき、右下隅や中央などの画像内の特定の場所にテキストが正確に表示されることがよくあります。しかし、フォントのサイズと各文字の幅のため、透かしの位置を計算することがしばしば面倒になります。幸いなことに、PHPのImageFontWidth()関数は、特に組み込みのフォントを使用する場合にこの問題を解決します。これにより、テキストの幅を正確に計算し、テキストの正確な位置決めを実現できます。
ImageFontWidth()は、指定されたフォント番号で各文字のピクセル幅を返すPHPのGDライブラリ関数の1つです。その構文は次のとおりです。
int imagefontwidth(int $font);
この関数は、1〜5などのGDライブラリに組み込まれたフォントにのみ適しています。 imagettftext()によって読み込まれたTTFフォントを使用している場合は、代わりにimagettfbbox()を使用してサイズを計算してください。
写真にテキスト透かしを追加するときは、透かしテキストの幅と高さを明確にして、開始座標を決定する必要があります。たとえば、透かしを右下隅に表示する場合は、透けたテキストの幅を知る必要があります。これにより、画像の右側からx座標として差し引くことができます。
しかし、多くの人々は、幅の参照として文字列の長さを直接使用しますが、これは不正確です。各フォントの文字幅は異なる場合があり、同じフォントであっても、異なる文字幅が異なる場合があります(特にモノスペースフォントと広がりフォント)。
特定の例を見てみましょう。写真の右下隅に「Copyright M66.net」というテキストを追加します。
<?php
// 写真の読み込み
$image = imagecreatefromjpeg('background.jpg');
// フォント番号とテキストを設定します
$font = 4; // 内蔵フォント番号 1-5
$text = '無断転載を禁じます m66.net';
// テキストの幅と高さを取得します
$textWidth = imagefontwidth($font) * strlen($text);
$textHeight = imagefontheight($font);
// 画像サイズを取得します
$imageWidth = imagesx($image);
$imageHeight = imagesy($image);
// テキストの色を設定します(白)
$textColor = imagecolorallocate($image, 255, 255, 255);
// テキストの左上隅座標を計算します(右下隅でオフセット10ピクセル)
$x = $imageWidth - $textWidth - 10;
$y = $imageHeight - $textHeight - 10;
// テキストを書きます
imagestring($image, $font, $x, $y, $text, $textColor);
// 出力画像
header('Content-Type: image/jpeg');
imagejpeg($image);
// リソースを破壊します
imagedestroy($image);
?>
このコードでは、 ImageFontWidth($ font)は各文字の幅を返し、 strlen($ text)は文字の数を返し、2つを掛けてテキスト全体のピクセル幅を取得します。次に、画像幅からテキストの幅とマージンを差し引くと、右下隅の正確な座標が取得されます。
ImageFontWidth()は、 GDビルトインフォントを使用して透かし測位を扱うときに、より正確にすることができるシンプルですが非常に便利なツールです。 ImageFonTheIght()を使用すると、任意の位置を正確に制御できます(左上、右上、中央など)。カスタムTTFフォントの使用など、より複雑なテキストレンダリングが必要な状況については、より複雑な境界計算にImagetTFBBox()を使用することを検討してください。
ImageFontWidth()とImageFonTheIght()を使用して、画像に透かしを追加して、正確で効率的になります。