PHP imagettftext базовый обходной путь

Я пишу для печати текста на изображение с помощью PHP. Однако, функция imagettftext() использует базовую линию, тогда как мне нужен текст по вертикали.

Итак, мне либо нужен метод для печати текста с y не расстояние от вершины до базовой линии, но сверху до вершины ограничительной рамки, либо мне нужен метод, с помощью которого я мог бы определить расстояние между верхней частью ограничительной рамки и базовой линией.

видимо, я путаю. Итак, чтобы прояснить: я знаю о функции imagettfbbox(). Используя эту функцию, я могу определить высоту и ширину результирующего текстового поля. Его высота, однако, совершенно бесполезна для вертикального выравнивания при печати с imagettftext(), потому что параметр Y - это не расстояние до верхней части окна (или даже до нижней, но, по крайней мере, то, что я мог бы использовать с высотой), а расстояние до базовой линии текста внутри.

EDIT: почему я не принимаю последний ответ?

посмотреть мой последний комментарий ниже ответьте и используйте это изображения в качестве ссылки.

2 ответов


Я не знаю, если ответ еще интересует.Однако функция imagettfbbox () дает вам больше информации, чем просто высота и ширина ограничивающей рамки. Он предназначен именно для возврата информации, необходимой imagettftext() для управления текстом, как вы хотите.

хитрость заключается в том, что координаты, возвращаемые из imagettfbbox (), не связаны с абсолютным верхним левым углом, а с базовой линией шрифта для конкретного текста. Это причина в том, что поле указано в координатах точек, и они часто являются отрицательными.

короче:

$dims = imagettfbbox($fontsize, 0, $font, $text);

$ascent = abs($dims[7]);
$descent = abs($dims[1]);
$width = abs($dims[0])+abs($dims[2]);
$height = $ascent+$descent;

...

// In the example code, for the vertical centering of the text, consider
// the simple following formula

$y = (($imageHeight/2) - ($height/2)) + $ascent;

Это прекрасно работает для моих проектов. Надеюсь, это поможет.

извините за английский. Маркос.


не совсем уверен, что вы просите...можете привести пример? Возможно!--3-->imagettfbbox это то, что вам нужно?

// get bounding box dims
$dims = imagettfbbox($fontsize, 0, $font, $quote);

// do some math to find out the actual width and height
$width = $dims[4] - $dims[6]; // upper-right x minus upper-left x 
$height = $dims[3] - $dims[5]; // lower-right y minus upper-right y

edit: вот пример вертикально центрированного текста

<?php
$font = 'arial.ttf';
$fontsize = 100;
$imageX = 500;
$imageY = 500;

// text
$text = "FOOBAR";

// create a bounding box for the text
$dims = imagettfbbox($fontsize, 0, $font, $text);

// height of bounding box (your text)
$bbox_height = $dims[3] - $dims[5]; // lower-right y minus upper-right y

// Create image
$image = imagecreatetruecolor($imageX,$imageY);

// background color
$bgcolor = imagecolorallocate($image, 0, 0, 0);

// text color
$fontcolor = imagecolorallocate($image, 255, 255, 255);

// fill in the background with the background color
imagefilledrectangle($image, 0, 0, $imageX, $imageY, $bgcolor);

$x = 0; 
$y = (($imageY/2) - ($bbox_height/2)) + $fontsize;
imagettftext($image, $fontsize, 0, $x, $y , $fontcolor, $font, $text);

// tell the browser that the content is an image
header('Content-type: image/png');
// output image to the browser
imagepng($image);

// delete the image resource 
imagedestroy($image);
?>