ImageMagick: как нарисовать две строки с разным размером поверх изображения? - PullRequest
3 голосов
/ 28 августа 2011

Я хочу нарисовать прямоугольник с двумя строками. Я хочу, чтобы первая строка имела размер 15pt (это число), вторая - размер 10pt (метка). В прямоугольник легко нарисовать одну строку одного размера, я делаю это так:

$image = new Imagick('someimage.png');
$draw = new ImagickDraw;
$draw->setGravity(Imagick::GRAVITY_CENTER);
$draw->setfont(__DIR__ . DS . 'TREBUCBD.TTF');
$draw->setfontsize(15);
$draw->annotation(0, 0, '50 points');
$image->drawImage($draw);

Идея здесь состоит в том, чтобы "50" в "50 баллах" были большими.

Я попытался сделать $ draw-> push (), чтобы перенести текущие настройки в стек, затем снова установить размер шрифта и аннотацию, но затем две строки перекрываются. Я пытался сделать это часами. Любая помощь очень ценится!

Вышеуказанная реализация написана на PHP, но, вероятно, мне удастся сделать это даже на примере, демонстрирующем использование командной строки ImageMagick.

edit: я получил награду за решение, реализованное на PHP.

Ответы [ 2 ]

4 голосов
/ 29 августа 2011

Вы можете использовать опцию + append , чтобы объединить две разные текстовые метки по горизонтали (-append - по вертикали):

convert -background grey -pointsize 15 -fill black label:abc \
        -pointsize 10 -fill red label:cdefgh -gravity South +append test.png

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

enter image description here

Еще раз: размер этого изображения автоматически рассчитывается в соответствии с вашими метками,Для этого вы можете использовать функции Imagick::labelImage и Imagick::appendImages.(Чтобы сделать изображение без фона, вы можете указать -backround transparent, например, через Imagick::setBackgroundColor)

После этого результирующее изображение с метками может быть составлено из чего угодно.

2 голосов
/ 07 сентября 2011

Добавьте достаточно места перед «точками» и после «50», чтобы вы правильно их выровняли:

<?php
$image = new Imagick('test.png');
$draw = new ImagickDraw;
$draw->setGravity(Imagick::GRAVITY_CENTER);
$draw->setfontsize(30);
$draw->annotation(0, 0, '50         ');
$image->drawImage($draw);

$draw = new ImagickDraw;
$draw->setGravity(Imagick::GRAVITY_CENTER);
$draw->setfontsize(15);
$draw->annotation(0, 0, '      points');
$image->drawImage($draw);

file_put_contents('test.png', $image->getImageBlob());
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...