PHP Conference Nagoya 2025

imageftbbox

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

imageftbboxBir FreeType2 yazı tipi ile yazılacak bir metnin çerçevesini hesaplar

Açıklama

imageftbbox(
    float $boyut,
    float $açı,
    string $yazıtipi,
    string $metin,
    array $seçenekler = []
): array|false

Bu işlev, bir FreeType2 yazı tipi ile yazılacak bir metnin çerçevesini hesaplar.

Bilginize:

PHP 8.0.0 öncesinde imageftbbox() işlevi imagettfbbox() işlevinin geliştirilmişi olup ek olarak seçenekler bağımsız değişkenine sahipti. PHP 8.0.0 ve sonrasında imagettfbbox() işlevi imageftbbox() işlevinin takma adıdır.

Bağımsız Değişkenler

boyut

Punto cinsinden yazıtipi boyutu.

açı

Metnin yazım açısı.

yazıtipi

FreeType2 yazı tipi dosyasının ismi. Bir URL olarak belirtilebilir. PHP'nin kullandığı GD kütüphanesinin sürümüne bağlı olarak, / ile başlamayan bir FreeType2 dosya ismine .ttf uzantısı eklenir ve kütüphane bu dosya ismini kütüphanede tanımlı dizinlerde arar.

metin

Çerçevesi hesaplanacak metin.

seçenekler

seçenekler için olası dizi indisleri
Anahtar Türü Anlamı
linespacing float Satırlar arasındaki boşluğu tanımlar.

Dönen Değerler

Metin çerçevesinin dört köşesinin koordinatlarını içeren 8 elemanlı bir dizi ile döner:

0 Sol alt köşenin X konumu
1 Sol alt köşenin Y konumu
2 Sağ alt köşenin X konumu
3 Sağ alt köşenin Y konumu
4 Sağ üst köşenin X konumu
5 Sağ üst köşenin Y konumu
6 Sol üst köşenin X konumu
7 Sol üst köşenin Y konumu

Noktalar açıdan bağımsız olarak metne görelidir. Yani, "sol üst" denince metne yatay olarak bakarken sol üst köşe kastedilmektedir.

Başarısızlık durumunda, false döner.

Örnekler

Örnek 1 - imageftbbox() örneği

<?php
// Tuvalimizi oluşturalım
$im = imagecreatetruecolor(300, 150);
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);

// Artalan rengi beyaz olsun
imagefilledrectangle($im, 0, 0, 299, 299, $white);

// Yazı tipi dosyamızın yolu
$font = './arial.ttf';

// Metin çerçevesini hesaplatalım
$bbox = imageftbbox(10, 0, $font, 'The PHP Documentation Group');

// Metnin yazılmaya başlanacağı koordinatlar
$x = $bbox[0] + (imagesx($im) / 2) - ($bbox[4] / 2) - 5;
$y = $bbox[1] + (imagesy($im) / 2) - ($bbox[5] / 2) - 5;

imagefttext($im, 10, 0, $x, $y, $black, $font, 'The PHP Documentation Group');

// Görüntüyü çıktılayalım
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

Notlar

Bilginize: Bu işlev sadece, PHP, freetype desteği (--with-freetype-dir=DİZİN seçeneği) ile derlenmişse kullanılabilir.

Ayrıca Bakınız

  • imagefttext() - Bir metni bir görüntüye bir FreeType 2 yazı tipini kullanarak yazar
  • imagettfbbox() - TrueType yazıtipi kullanılan bir metnin çerçevesini döndürür
add a note

User Contributed Notes 8 notes

up
2
fernando
19 years ago
imagettfbbox() returns an array with 8 elements representing four points making the bounding box of the text:

0 lower left corner, X position
1 lower left corner, Y position
2 lower right corner, X position
3 lower right corner, Y position
4 upper right corner, X position
5 upper right corner, Y position
6 upper left corner, X position
7 upper left corner, Y position

The points are relative to the text regardless of the angle, so "upper left" means in the top left-hand corner seeing the text horizontally.
up
1
phpimageftbbox at juggernaut dot com dot au
22 years ago
This function can be used to generate right-aligned text. Just work out how wide the text image is and position it accordingly. Example:

$i_width = 200;
$i_height = 40;

$string = "Hello World!";
$pointsize = 10;
$fontfile = "/usr/local/lib/ttf/Helve.ttf";

$im = imagecreate($i_width, $i_height);
$black = imagecolorallocate ($im, 0, 0, 0);
$white = imagecolorallocate ($im, 255, 255, 255);

$string_size = ImageFtBbox($pointsize, 0, $fontfile, $string, array("linespacing" => 1));
$s_width = $string_size[4];
$s_height = $string_size[5];

ImageFtText($im, $pointsize, 0, $i_width - $s_width - 1, 0 - $s_height, $white, $fontfile, $string, array("linespacing" => 1));

Header ("Content-type: image/png");
ImagePNG ($im);
ImageDestroy ($im);
up
1
sectionthirty1 at yahoo dot com
20 years ago
Here is a handy example I used to center "dynamic text" onto an image.

Ex. Say you want to center a clients IP Address onto a picture.

$ip=$_SERVER['REMOTE_ADDR'];

$details = imageftbbox($fontsize, 0, $font, $ip, array("linespacing" => 1));

$xcoord = ($imgwidth - $details[4]) / 2; // this will return the x coordinate centered to your specific image. Make sure you set $imgwidth to the width of the image you are using.

imagettftext($image, $fontsize, 0, $xcoord, $ycoord, $fontcolor, $font, $ip);
up
0
theo v e -2
18 years ago
ah... the problem between imageftbbox() and imagefttext() lies in the mirroring of the y-axes.
Below you see, for a font-size 16 the boudingboxes of "b", "p" and "bp":
< b: w=9 h=15
b(0,-1)
b(9,-1)
b(9,-16)
b(0,-16)
< p: w=9 h=16
p(0,4)
p(9,4)
p(9,-12)
p(0,-12)
< bp: w=20 h=20
bp(0,4)
bp(20,4)
bp(20,-16)
bp(0,-16)
If drawing "bp" using imagefttext() at y=0, the the top of "bp" indeed is at y=-16, and the bottom of "bp" at y=4. (Plus or minus a pixel here and there, because at y=0 there actually is a vissible pixel.)
up
-1
pablocorezzola at gmail dot com
7 years ago
//EXAMPLE - Center text

function newText($im, $size, $angle= 0, $x, $y, $color, $font, $text,$align = "left",$border=false,$width=0,$height=0){

if($align == "center")
{
if ($border == true ){
imagerectangle($im, $x, $y, $x +$width, $y + $height, $color);
}
$bbox = imageftbbox($size, 0, $font, $text);

// Marcamos el ancho y alto
$s_width = $bbox[4];
$s_height = $bbox[5];

$y = $y + ($height-$s_height)/2;
$x = $x + ($width-$s_width)/2;

}

imagettftext($im, $size, $angle, $x, $y, $color, $font, $text);
}
up
-1
Johan
17 years ago
For alignment i used this method:

if($align == "center" || $align == "right")
{
$verticaltxtspace = $backwidth - (2 * $posx);
$spacepositions = imagettfbbox($size, $angle, "fonts/verdanaz.ttf", " ");
$spacepx = $spacepositions[4] - $spacepositions[0];

// Split text in lines
$lines = split("[\r][\n]", $text);
for($count = 0; $count < count($lines); $count++)
{
$textpositions = imagettfbbox($size, $angle, "fonts/verdanaz.ttf", $lines[$count]);
$textpx = $textpositions[2] - $textpositions[0];

if($align == "right")
{
$spaces = ($verticaltxtspace - $textpx) / $spacepx;
}
else if($align == "center")
{
$spaces = (($verticaltxtspace - $textpx)/2) / $spacepx;
}

// Add spaces
$line = $lines[$count];
for($i = 0; $i < $spaces; $i++)
{
$line = " " . $line;
}
$lines[$count] = $line;
}

// Create new text of lines
$text = "";
for($count = 0; $count < count($lines); $count++)
{
$text .= $lines[$count] . "\r\n";
}
}


// Draw the shadow text on de shadow
imagettftext($background, $size, $angle, $posx, $posy, $textcolor, "fonts/verdanaz.ttf", $text);
up
-2
ta at NOSPAM dot magicsquare dot info
22 years ago
i've found a work around for this situation

it seems that height is directly proportional to line spacing so you just have to apply the same factor to image height

for example :

$spacing = 0.7;
$params = array("linespacing" => $spacing);

$box = imageftbbox ($size, 0, $font, $text, $params);
$tw=$box[4]-$box[0]; //image width
$th=($box[1]-$box[5])*$spacing; //image height
up
-3
groomed at users dot sf dot net
20 years ago
ImageFTBBox returns a bounding box, not metrics, as some (most?) of the notes above seem to assume. The 8 values it returns specify the 4 corners of this bounding box. So to properly determine the width and height of a string you need to do:

$bbox = ImageFTBBox(...);
$width = abs($bbox[0]) + abs($bbox[2]); // distance from left to right
$height = abs($bbox[1]) + abs($bbox[5]); // distance from top to bottom
To Top