web-dev-qa-db-ja.com

PHP GDを使用してテキスト幅を計算する

Gd PHPで生成された画像に追加するために、動的なテキスト行の幅を取得しようとしています。でも少しわかりません。 imageloadfont()を使用してフォントをロードする方法を知っていますが、.ttfファイルを使用できますか?サイズ12のarialフォントを使用してテキストの幅を知りたい。 ttfファイルを使用しようとすると、「フォントの読み取りエラー、無効なフォントヘッダー」というエラーが表示されます。 .gdfファイルが必要な場合、フォントサイズ12のgdfファイルはどこにありますか?これが私のコードです:

$newfont = imageloadfont("../fonts/arial.ttf");
$font_width = imagefontwidth($newfont);
$font_height = imagefontheight($newfont);
15
Colin

imageloadfont()は、ユーザー定義のビットマップをロードするために使用されます。 Arialまたはその他のTrueTypeフォント(.ttf)またはOpenTypeフォント(.otf)を使用したいだけの場合(Gd libでの後者のサポートはバグが多い)、必要なのは imagettftext() 。ただし、imagettftext()を使用して画像にテキストを書き込む前に、まずそれが収まるかどうかを知る必要があります。これを知るには、 imagettfbbox() を呼び出して、フォントサイズ、テキストの角度(水平テキストの場合は0)、. ttfまたは.otfフォントへのパスを渡す必要があります。ファイルとテキスト自体の文字列を返すと、テキストの境界ボックスを作成する4つのポイントを表す8つの要素を持つ配列が返されます(詳細については、PHP手動)を確認してください)。そして、その特定のテキスト文字列が占める幅と高さを知るために計算を実行します。次に、これらの値を使用して、テキスト全体を表示できる特定の幅と高さの画像を作成できます。

これは、開始するために実行しようとしていることを実行する簡単なスクリプトです。

<?php # Script 1

/*
 * This page creates a simple image.
 * The image makes use of a TrueType font.
 */

// Establish image factors:
$text = 'Sample text';
$font_size = 12; // Font size is in pixels.
$font_file = 'Arial.ttf'; // This is the path to your font file.

// Retrieve bounding box:
$type_space = imagettfbbox($font_size, 0, $font_file, $text);

// Determine image width and height, 10 pixels are added for 5 pixels padding:
$image_width = abs($type_space[4] - $type_space[0]) + 10;
$image_height = abs($type_space[5] - $type_space[1]) + 10;

// Create image:
$image = imagecreatetruecolor($image_width, $image_height);

// Allocate text and background colors (RGB format):
$text_color = imagecolorallocate($image, 255, 255, 255);
$bg_color = imagecolorallocate($image, 0, 0, 0);

// Fill image:
imagefill($image, 0, 0, $bg_color);

// Fix starting x and y coordinates for the text:
$x = 5; // Padding of 5 pixels.
$y = $image_height - 5; // So that the text is vertically centered.

// Add TrueType text to image:
imagettftext($image, $font_size, 0, $x, $y, $text_color, $font_file, $text);

// Generate and send image to browser:
header('Content-type: image/png');
imagepng($image);

// Destroy image in memory to free-up resources:
imagedestroy($image);

?>

必要に応じて値を変更してください。 PHPマニュアルを読むことを忘れないでください。

36
hallaplay835

Gd2では、imagettfbboxのフォントサイズは、次の変換を使用するピクセルではなく、PTである必要があります。

($ fontSizeInPixel * 3)/ 4

1
Sentence