Centerowanie tekstu w PHP GD

Jerzy Biernacki
05.09.2015

PHP GD nie posiada standardowo żadnej wbudowanej funkcji umożliwiającej wycentrowanie tekstu względem obrazka. W tym artykule przedstawię, jak napisać prostą funkcję służącą do tego.

Plan:
- Dzielimy szerokość obrazka na 2
- Obliczamy szerokość tekstu.
- Również dzielimy go na 2.
- Od podzielonej szerokości obrazka odejmujemy "połówkę" szerokości tekstu.
- Cieszymy się pozycją X tekstu smile.gif
- Z Y podchodzimy podobnie:
- Do połowy wysokości obrazka dodajemy "połówkę" wysokości tekstu. (A dlaczego? Bo Y podawane do imagettftext to "baseline", czyli dolna linia!)

Skorzystamy z funkcji "imagettfbbox" aby obliczyć szerokość tekstu.
Funkcję, która będzie zwracać tablicę z pozycją [XY], w której powinniśmy wyświetlić tekst będzie się roboczo nazywać textCenter.
W parametrach będzie kolejno przyjmować:

CYTAT
$img - uchwyt naszego obrazka (stworzony np. funkcją imagecreate() )
$text - tekst, który chcemy wycentrować.
$size - wielkość czcionki.
$font - ścieżka do pliku z czcionką.



Kod:

KOD
<?
function textCenter($img, $text, $size, $font) {
$t = imagettfbbox($size, 0, $font, $text);
$x = (imagesx($img)/2) - (($t[4] - $t[6])/2);
$y = (imagesy($img)/2) + (($t[1] - $t[7])/2);
return array("x" => round($x), "y" => round($y));
}
?>



Przykład użycia:

KOD
<?
/* Ustawiamy katalog czcionek na katalog skryptu.*/
putenv('GDFONTPATH=' . realpath('.'));
$img = imagecreatetruecolor(200,50);

/* Nasz tekst;] */
$n = "Welcome!";

/* tu możesz podać nazwę jakiejkolwiek czcionki,
   która jest w katalog skryptu*/
$font = "MyUnderwood.ttf";

/* Wielkość czcionki */
$fontsize = 20;

/* Kolorek rushoFFy
(zerżnięty z php.net:
http://pl.php.net/imagecreatetruecolor);] */
$text_color = imagecolorallocate($img, 233, 14, 91);

/* Nasza funkcja */
function textCenter($img, $text, $size, $font) {
$t = imagettfbbox($size, 0, $font, $text);
$x = (imagesx($img)/2) - (($t[4] - $t[6])/2);
$y = (imagesy($img)/2) + (($t[1] - $t[7])/2);
return array("x" => round($x), "y" => round($y));
}

$t = textCenter($img, $n, $fontsize, $font);
imagettftext($img, $fontsize, 0, $t['x'], $t['y'], $text_color, $font, $n);

/* Wyświetlamy obrazek */
header("Content-Type: image/png");
imagepng($img);
imagedestroy($img);
?>
 

 
 
Zgłoś swój pomysł na artykuł

Więcej w tym dziale Zobacz wszystkie