Заголовок ImageMagick в PHP не заполняет размер по вертикали

Я собрал следующий код, который почти работает:

<?php
$img = new Imagick("quote_blank.jpg");
$txt = new Imagick();
$txt->setBackgroundColor("transparent");
$txt->newPseudoImage(380,250, "Caption:".htmlspecialchars($_GET['quote']) );
$txt->colorizeImage('#468847',1);
$img->compositeImage($txt, imagick::COMPOSITE_OVER, 10, 80);
$draw = new ImagickDraw();
$draw->setFillColor('#468847');
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);
$draw->setFontSize(25);
$draw->setFontStyle(3);
$img->annotateImage($draw, 5,5,0, htmlspecialchars($_GET['attrib']) );
$img->setImageFormat('jpg');
header('Content-Type: image/jpeg');
echo $img;
?>

(обратите внимание, что quote_blank.jpg — это фоновое изображение размером 400×400, на котором текст отображается и находится в том же каталоге, что и файл php).

Проблема в том, что заголовок наполняет псевдоизображение 380×250 только небольшим количеством коротких слов. Любая длина любой длины приводит к тому, что только верхняя половина (или меньше) поля содержит какой-либо текст (кроме аннотации атрибуции).

Кажется, что PseudoImage работает правильно, но алгоритм ImageMagick для расчета размера шрифта предназначен только для заполнения ширины, а не высоты. Я понятия не имею, как он решает, какую длину строки выбрать (что, в свою очередь, по-видимому, диктует размер шрифта и, следовательно, количество строк и вертикальное покрытие поля заголовка).

Поэтому я предполагаю, что мой вопрос заключается в следующем: есть ли способ изменить методы вычислений, чтобы заполнить как можно большую часть поля заголовка, горизонтального и вертикального?

Пример нескольких слов, показывающих, что заголовок может быть в полный рост:

Образец более типичной длины текста, показывающий, что он не заполняет прямоугольник по вертикали

2

Решение

Я проверил ваш код с ImageMagick 6.8.9-8 и получил следующий вывод, который лучше, чем вы получаете. Если вы используете более старую версию, попробуйте обновить ImageMagick.

введите описание изображения здесь

1

Другие решения

Виниций Пинто сразу же получил правильный ответ. Но обновление не было так просто на общем сервере — я не понял, как заставить Imagick использовать обновленную версию. Поэтому мне пришлось переписать свой код для доступа к ImageMagick через командную строку, которой я хотел поделиться. Насколько я могу судить по комментарию, код не отображается должным образом, так что извините за измену функции ответа.

$location='/home/user/local/bin/convert';
$command='convert -background none -size 380x250 -fill "#468847" caption:"'.htmlspecialchars($_GET['quote']).'" quote_blank.jpg +swap -gravity southeast -geometry +10+80 -composite convert -fill "#468847" -gravity southeast -pointsize 25 -annotate 0x20+5+5 "'.htmlspecialchars($_GET['attrib']).'" anno_label.jpg';
exec ($location . ' ' .$command);
header('Content-Type: image/jpeg');
readfile('anno_label.jpg');
unlink('anno_label.jpg');

введите описание изображения здесь

0