ImageMagick: составление с результатами многократного преобразования

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

Длинное объяснение:

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

  • avatar.jpg необходимо преобразовать в закругленное изображение -> rounded-avatar.jpg
  • К background.jpg должен быть применен цветной слой -> color-background.jpg

Затем я хочу dissolve rounded-avatar.png в color-background.jpg, чтобы получить что-то вроде этого:

  +-----------+
  |     O     |
  +-----------+

Что у меня есть:

Я знаю, как выполнять эти операции последовательно (возможно, это не лучший способ, но это не тема этого вопроса), я даже сделал рабочий сценарий bash:

#!/bin/bash

convert $1 -alpha set -background none -vignette 0x0 rounded-avatar.png

convert $2 -auto-orient -thumbnail 600x313^ -gravity center -extent 600x313 -region 100%x100% -fill "#256997" -colorize 72% colored-background.jpg

composite -dissolve 100 -gravity Center rounded-avatar.png colored-background.jpg -alpha Set $3

Что я могу назвать это

$ ./myScript.sh avatar.jpg background.jpg output.jpg

Чего я хочу:

Я хочу избежать сохранения двух временных изображений (Round-avatar.jpg и color-background.jpg) в файловой системе.

Почему?

  • Эта процедура должна выполняться автоматически на веб-платформе, я не хочу обрабатывать параллелизм в этих временных файлах с помощью уловок с именами.
  • Текущий сценарий заставляет IM загружать изображения два раза в память, вероятно, было бы более эффективно повторно использовать вычисленные изображения вместо того, чтобы записывать их на диск, а затем загружать их в новом процессе.
  • В наши дни дискового ввода-вывода мало, давайте немного сэкономим.

Надеюсь, мне просто не хватает правильных ключевых слов, чтобы найти ответ в документации.

Я понимаю, что это может показаться чрезмерной оптимизацией, и я не борюсь с проблемами C10k здесь, но я просто хочу сделать это правильно (и понять синтаксис IM).


person g4vroche    schedule 05.06.2015    source источник
comment
Не могли бы вы предоставить свои входные изображения, а также выходные данные, которые производит ваш скрипт?   -  person Kurt Pfeifle    schedule 05.06.2015


Ответы (2)


Сложно помочь, не видя ваших изображений! Думаю, это будет выглядеть примерно так:

convert -gravity center                                    \
        \( $1 -alpha set -background none -vignette 0x0 )\ \
        \( $2 -auto-orient -thumbnail 600x313^ -gravity center -extent 600x313 -region 100%x100% -fill "#256997" -colorize 72% )\ \
        -compose dissolve -composite result.jpg

Основные части

а) что вы можете использовать круглые скобки для 'aside-processing' одного конкретного изображения

б) что вы можете загрузить 2 или более изображений в своего рода стек изображений для обработки

c) что вы можете использовать оператор -composite команды convert после установки типа -compose вместо самой команды compose.

Вариант 2

Другой вариант может заключаться в использовании формата MIFF для нескольких изображений и канала, например:

convert \( $1 .... \) \( $2 ... \) miff:- | composite -dissolve 100 -gravity center -   ... 

Вариант 3

Еще один вариант - использовать отдельный convert для каждого входного файла, а затем отправлять объединенные результаты третьему convert или composite следующим образом:

(convert -size 100x100 xc:red miff:- ; convert -size 100x100 xc:blue miff:- ) | convert - +append result.jpg

что дает это:

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

Вариант 4

Если изображения нуждаются в значительной обработке перед объединением, вы можете разработать вариант 3, чтобы два входных изображения обрабатывались параллельно, например

mkfifo fifo1 fifo2 2>/dev/null
convert -size 2000x2000 xc:gray +noise gaussian -median 7 jpeg:fifo1 &
convert -size 2000x2000 xc:gray +noise gaussian -median 7 jpeg:fifo2 &
convert fifo1 fifo2 +append result.jpg       # or equally "convert fifo[12] ..."

что занимает 33 секунды, тогда как последовательная версия ниже занимает 64 секунды и использует 2 МБ дискового пространства сверху.

convert -size 2000x2000 xc:gray +noise gaussian -median 7 1.jpg
convert -size 2000x2000 xc:gray +noise gaussian -median 7 2.jpg
convert 1.jpg 2.jpg +append result.jpg       # or equally "convert [12].jpg..."
person Mark Setchell    schedule 05.06.2015
comment
Это именно то, что я искал! Я не понимал, что можно загружать другие изображения внутри скобок, поскольку в большинстве примеров используется -clone. Теперь это выглядит очевидным :). Просто нужно было внести 2 небольших изменения в ваш фрагмент: переставить обратную косую черту для закрывающих скобок и перевернуть два изображения в стеке, чтобы получить желаемый результат. благодаря. - person g4vroche; 06.06.2015

Ответ Марка (я не смотрел на него слишком внимательно), я надеюсь, что он сделает "правильные вещи" для вас.

Касательно...

«Я просто хочу сделать это правильно (и понять синтаксис IM)».

... эти два других ответа SO могут помочь вам лучше понять синтаксис IM:

person Kurt Pfeifle    schedule 05.06.2015
comment
Спасибо, я разберусь в этом. - person g4vroche; 06.06.2015