Используя ImageMagick в командной строке, я могу сказать
convert -background '#0000' -fill white -stroke black -strokewidth 3 -gravity center -pointsize 78 -size 568x1000 caption:'Lorem ipsum etc etc' -trim +repage out.png
И создайте результат, который я ищу. То, что я хотел бы сделать, это то же самое, но в PerlMagick, чтобы мне не приходилось продолжать читать и записывать файлы, выполняя различные другие шаги. Вот что у меня есть до сих пор
use strict;
use warnings;
use Image::Magick;
my $im = new Image::Magick;
my $e = $im->Set(
background => '#0000',
fill => 'white',
stroke => 'black',
strokewidth => 3,
gravity => 'center',
pointsize => 78,
size => '586x1000',
);
die $e if $e;
$e = $im->Read("caption:Lorem ipsum etc etc");
die $e if $e;
$e = $im->Trim();
die $e if $e;
$e = $im->Set(page=>'0x0+0+0'); # +repage
die $e if $e;
$e = $im->Write('out.png');
die $e if $e;
И это работает точно так же, за исключением того, что результирующий текст не центрируется.
Документации по PerlMagick почти не существует. Я основал этот синтаксис «прочитать заголовок» на некоторых примерах MagicWand, где утверждается, что это приведет к выравниванию текста по центру. Очевидно, что-то другое для PerlMagick.
Итак, вопрос: как я могу заставить PerlMagick уважать гравитацию в этом случае? Как с помощью PerlMagick получить многострочный, центрированный и переносимый по словам текст? Обратите внимание, что для этого требуется, чтобы я использовал подпись, а не аннотировал или рисовал. Я бы предпочел избегать ручного построчного центрирования, но я бы рассмотрел это.
В качестве альтернативы, если у кого-то есть пример переноса слов с пропорциональными шрифтами и Annotate, это сработает для меня.
РЕДАКТИРОВАТЬ: обратите внимание, что опция -caption для поляроида, хотя и разделяет реализацию с тем, что я делаю, не совпадает с подписью: псевдоизображение. Я бы все равно принял ответ, используя polaroid и -caption, если вывод точно соответствует тому, что дано приведенным выше примером команды convert.
РЕДАКТИРОВАТЬ 2: вот более минимальный пример проблемы.
use strict;
use warnings;
use Image::Magick;
my $im = new Image::Magick;
my $e = $im->SetAttribute(
background => '#0000',
pointsize=>12,
size => '100x100',
gravity => 'center',
);
die $e if $e;
$e = $im->ReadImage('caption:The quick brown fox jumps over the lazy dog.');
die $e if $e;
$e = $im->Write('out.png');
die $e if $e;
Ожидаемый результат: текст выравнивается по центру.
Фактический результат: текст выровнен по левому краю.
Фактический результат должен быть идентичен выводу этой команды:
convert -background '#0000' -size 100x100 -pointsize 12 -gravity center caption:'The quick brown fox jumps over the lazy dog.' out.png
Глядя на источник perlmagick, я не вижу ничего, что должно было бы перехватывать конкретный вызов SetAttribute, поэтому я не понимаю, почему гравитация игнорируется. Как я могу заставить гравитацию не игнорироваться для этого? Или, как еще я могу сделать перенос слов и центрированный текст с таким выводом?