Объединение нескольких изображений в ImageMagick с относительным (не абсолютным) смещением

Я ищу наиболее эффективный способ объединения нескольких изображений в ImageMagick поверх фонового изображения, чтобы расстояние/заполнение между наложенными изображениями было одинаковым?

Я исследовал использование +append, convert -composite и convert с объединением -page и -layers.

Следующая команда (convert -composite) работает, но требует предварительного расчета размеров изображения, чтобы указать абсолютные смещения. Действительно, мне нужен зазор в 10 пикселей между концом ПЕРВОГО многослойного изображения и началом второго многослойного изображения, но единственный способ добиться этого, как я вижу, — указать абсолютное смещение от верхнего левого угла холста. .

convert \
  background.jpg \
  first.jpg -gravity Northwest -geometry  +10+10 -composite \
  second.jpg                   -geometry +300+10 -composite \
  third.jpg                    -geometry +590+10 -composite \
  output.jpg

Я ищу какой-то оператор, чтобы горизонтальное смещение можно было интерпретировать относительно «последнего» изображения в слое, поэтому вместо указания +300+10 для второго изображения и +590+10 для третьего я могу каким-то образом указать смещение +10+10.

Я думал, что гравитация позволит мне добиться этого (-gravity Northwest) точно так же, как float: left; работает в позиционировании CSS, но это не так.

Я также добился некоторого успеха со следующим:

convert \
  -page  +10+10 first.jpg  \
  -page +300+10 second.jpg \
  -page +590+10 third.jpg  \
  -background transparent  \
  -layers merge \
   layered.png

convert background.jpg layered.png -gravity Center -composite output.jpg

Оба описанных метода требуют предварительного расчета абсолютных смещений, что немного утомительно. Есть лучший способ сделать это?


person Przemek Kujonewicz    schedule 05.09.2012    source источник
comment
Все ли ваши входные изображения для одного и того же процесса сшивания имеют одинаковую ширину и высоту (и, возможно, меняются только для следующего сшивания)?   -  person Kurt Pfeifle    schedule 05.09.2012
comment
Фон представляет собой реальное изображение, но его размеры будут статическими (или, по крайней мере, это будет какое-то изображение, которое легко мозаично или обрезается).   -  person Przemek Kujonewicz    schedule 05.09.2012
comment
Изображения не все имеют одинаковые размеры. Мы будем ограничивать их заданной максимальной высотой и максимальной шириной (чтобы определить), поэтому в зависимости от размеров входного изображения это ограничение приведет к переменной ширине.   -  person Przemek Kujonewicz    schedule 05.09.2012
comment
Вы не четко отвечаете на мой вопрос о размерах входного изображения. Опять же, по-другому: Могут ли изображения в одном процессе сшивания иметь разную ширину?   -  person Kurt Pfeifle    schedule 05.09.2012
comment
Да, они могут быть разной ширины.   -  person Przemek Kujonewicz    schedule 05.09.2012
comment
Так? Вы проверили процедуру из моего ответа?   -  person Kurt Pfeifle    schedule 05.09.2012


Ответы (2)


Вы пропустили команду montage.

Самая простая команда для добавления желаемого интервала — установить параметр -frame 5 с помощью -mattecolor none. Это работает с изображениями с разными значениями ширины и разделяет их на расстояние 10 пикселей:

montage             \
  -alpha on         \
  -background none  \
  -mode concatenate \
  -tile x1          \
  -frame 5          \
  -mattecolor none  \
   *.jpg            \
   output1.png

Однако вы легко заметите, что граница результирующего изображения имеет ширину всего 5 пикселей сверху, справа, снизу и слева. Чтобы удалить эти 5 пикселей вокруг, используйте:

convert  output1.png  -shave 5  output2.png

Чтобы наложить этот результат на ваш background.jpg, используйте:

convert             \
  background.jpg    \
  output2.png       \
 -gravity Northwest \
 -geometry +10+10   \
 -composite         \
  final.jpg
person Kurt Pfeifle    schedule 05.09.2012

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

Вот пример того, как добавлять изображения по горизонтали с промежутком в 10 пикселей между ними и с выравниванием изображений по верхнему краю:

convert \
  -frame 5 \
  -mattecolor none \
  -background none \
  -gravity north \
  first.jpg second.jpg third.jpg \
  +append \
  png:- | convert - -shave 5
  output.png

Для добавления изображений по вертикали используйте -append вместо +append. Я использовал трубку | чтобы сбрить внешнюю рамку в той же команде.

person toby-one    schedule 24.02.2014