Разместить изображение на странице с помощью ImageMagick с полями печати?

Я пытаюсь заставить ImageMagick что-то сделать для меня, и у меня возникает несколько проблем. Во-первых, я не разбираюсь в единицах измерения, которые передаются в ImageMagick, поэтому мой скрипт не производит то, что мне нужно. Во-вторых, то, как я это делаю, крайне неэффективно. Запуск этого скрипта занимает очень много времени (тот, что вы видите ниже, немного урезан по сравнению с тем, что я запускаю).

Итак, что я делаю... У меня есть несколько файлов svg с иконками. Я хочу создать страницу для каждого из этих файлов. Сгенерированная страница будет содержать значок, расположенный по всей странице с полем сбоку. Я ищу 1/2-дюймовые плитки с 1/2 полями вокруг страницы, которая должна быть буквой США (8 1/2 x 11 дюймов).

После прочтения большого количества документации это то, что я придумал.

colors=(red blue purple yellow green black)

mkdir -p generated/icons/
for color in ${colors[@]}; do
  images=`printf "source/icons/${color}.svg%.0s " {1..300}`
  montage $images -tile 15x20 -page Letter+1+1 -units PixelsPerInch -density 2550x3300 \
                  generated/icons/${color}.pdf
done

Итак, для каждого из моих файлов я запускаю montage. Я использую printf для повторения имени файла изображения 300 раз. Затем я выкладываю это 15x20 раз. 15x20 получается из 8,5 минус поля в 1 дюйм = 7,5*2 = 15 и аналогично (11-1)*2 = 20. 300 изображений получается из 15*20. Затем я говорю, что хочу это на странице письма со смещением 1x1. (Это была моя попытка получить запас) Я говорю, что говорю в пикселях на дюйм (но, похоже, ни одна из единиц не совпадает). Я установил dpi на 300 с помощью команды плотности, где 8,5 * 300 = 2550 и 11 * 300 = 3300.

Я играл с другими настройками (геометрия и т. д.), но ни один из них не работает. И единицы измерения тоже не имеют смысла... Прямо сейчас мой результирующий PDF-файл представляет собой квадрат и т.д....

Как сделать мозаичные страницы как таковые? Также есть ли способ сделать это более эффективно? То, что у меня есть до сих пор, очень медленно.

РЕДАКТИРОВАТЬ:

Еще немного информации:

i:montage --version Version: ImageMagick 6.8.8-10 Q16 x86_64 2015-03-10 http://www.imagemagick.org

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

мой текущий вывод: введите здесь описание изображения

Обратите внимание на неправильные поля, квадратная, а не буквенная страница, а также перекошенные плитки.


person David Mokon Bond    schedule 11.05.2017    source источник
comment
Нам было бы очень полезно понять, что вы пытаетесь сделать, если бы вы предоставили один файл SVG и соответствующий пример вывода. Также какую версию ImageMagick вы используете. Мозаика более эффективно выполняется с помощью преобразования и чтения изображения один раз, а не много раз. См. imagemagick.org/Usage/canvas/#tile для получения информации о способах разбиения. . Обычно я использую метод mpr:.   -  person fmw42    schedule 11.05.2017
comment
@fmw42 добавил несколько изображений, показывающих, что у меня есть на данный момент.   -  person David Mokon Bond    schedule 12.05.2017
comment
Ваш ввод - это PNG, а не SVG. Поэтому мы не можем начать с ваших исходных условий. Можете ли вы опубликовать ссылку на файл SVG, который соответствует предоставленному вами файлу PNG. Что вы имеете в виду, когда мозаичное изображение перекошено? Я этого не вижу.   -  person fmw42    schedule 12.05.2017
comment
Используете ли вы RSVG, Inkscape или IM MSVG/XML для чтения делегатов SVG и какую версию? Обратите внимание, что ваша версия IM устарела примерно на 100 версий. Возможно, вы захотите рассмотреть возможность обновления, если что-то не работает должным образом.   -  person fmw42    schedule 12.05.2017
comment
Какую выходную плотность вы хотите получить для своего результата? Это определит ваше качество. Например, если ваша плитка соответствует 0,5 дюйма при разрешении 72 dpi, то размер плитки составляет 0,5*72=36 пикселей. Но если вы хотите 300 dpi, то 0,5 * 300 = 150 пикселей на плитку.   -  person fmw42    schedule 12.05.2017
comment
P.S. Вы можете найти своего делегата и версию, используя формат convert -list и посмотрев, что он говорит для SVG.   -  person fmw42    schedule 12.05.2017
comment
Извините, только что вернулся к этому. Stackoverflow не позволил мне загрузить svg, поэтому я загрузил его в формате png. Я использовал ваш ответ ниже, и он работает только с svg. Спасибо!   -  person David Mokon Bond    schedule 12.05.2017


Ответы (1)


Учитывая предоставленное вами изображение в формате PNG, я предполагаю, что вам нужна белая рамка шириной 1 дюйм внутри напечатанного изображения размером 8,5x11 дюймов. Таким образом, ширина плитки будет 7,5 дюймов, а высота плитки будет 10 дюймов.

  • 1 дюйм = 300 точек на дюйм, поэтому толщина границы = 300 пикселей = 2 плитки толщиной
  • 11-1 = 10 дюймов в высоту для мозаичной области. Высота = 10 * 300 = 3000 пикселей.
  • 8,5-1 = 7,5 дюймов в ширину для мозаичной области. Ширина = 7,5 * 300 = 2250 пикселей.
  • 1 плитка = 0,5 дюйма при 300 dpi = 0,5*300 = 150 пикселей

convert lUDbK.png -resize "150x150!" -write mpr:tile +delete -size 2250x3000 tile:mpr:tile -bordercolor white -border 300 -units pixelsperinch -density 300 tiled_page.png

Время обработки на моем Mac Mini составило 1,75 секунды.

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

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

(Обратите внимание, что PNG поддерживает только пиксели на сантиметр, но IM соответствующим образом преобразует мою спецификацию в пикселях на дюйм. Поэтому, если вы посмотрите на метаданные, они, вероятно, покажут вам какую-то другую плотность в единицах пикселей на сантиметр. Но они будут соответствовать желаемым 300 dpi.)

person fmw42    schedule 12.05.2017
comment
Спасибо, это то, что я хотел. Я сделал небольшую корректировку, так как хотел только 1/2 рамки, чтобы она помещалась на одной странице. также производительность является приемлемой. - person David Mokon Bond; 12.05.2017