Порядок параметров командной строки ImageMagick (и категории параметров командной строки)
Мой руководитель попросил меня преобразовать части наших скриптов Perl, в которых вместо PerlMagick используется конвейер, и использовать версию ImageMagick для командной строки (по различным не связанным причинам).
Используя наш существующий интерфейс (обрезка, масштабирование, сохранение и т. Д.), Я создаю список операций, которые пользователь хочет выполнить над изображением, конструирует оператор для конвейера и затем выполняет его.
Что я хотел бы знать, это:
- Выполняются ли операции преобразования слева направо? то есть порядок я передаю им
- Что произойдет, если я передам один и тот же вариант дважды? Они выполняются отдельно?
Очевидно, что порядок, в котором выполняются операции над изображением, имеет жизненно важное значение, поэтому я пытаюсь понять, смогу ли я выполнить все операции за один раз (возможно, повысить эффективность?) Или если мне придется это выполнить каждая операция в отдельности. Спасибо
2 ответа
К сожалению, принятый ответ на этот вопрос еще не завершен...:-)
Три (основных) класса параметров
Предполагая, что ваша версия ImageMagick является последней, вот важная поправка к ней:
Вы должны различать 3 основных класса параметров командной строки:
- Настройки изображения
- Операторы изображений
- Операторы последовательности изображений
Эти три класса ведут себя по-разному:
Настройки изображения
Настройка изображения сохраняется в том виде, в котором она отображается в командной строке. Это может повлиять на всю последующую обработку (но не на предыдущую обработку):
- обработка, такая как чтение изображения или нескольких изображений позже в командной строке;
- обработка выполняется следующим оператором изображения;
- обработка ведется путем записи изображения в качестве вывода.
Настройка изображения остается в силе...
- ... либо пока он не будет сброшен, либо заменен другим параметром того же типа,
- ... или пока не закончится командная строка.
Операторы изображений
Оператор изображения применяется к (одному) изображению и забывается. Он отличается от настройки изображения, потому что он влияет на изображение сразу же, как оно появляется в командной строке. (Помните: настройка изображения сохраняется до тех пор, пока не завершится командная строка или пока она не будет сброшена.)
Если вам нужно применить один и тот же оператор изображения ко второму изображению в той же командной строке, вы должны повторить этот точный оператор в командной строке.
Строго говоря, в соответствии с новой архитектурой командных строк ImageMagick все операторы изображений должны записываться после загрузки изображения, для которого оно предназначено. Однако разработчики чата пошли на компромисс: в интересах обратной совместимости операторы изображений все еще могут появляться перед загрузкой изображения - они затем будут применены к первому доступному для них изображению.
Операторы последовательности изображений
Оператор последовательности изображений применяется ко всем загруженным в данный момент изображениям (а затем забывается).
Он отличается от простого оператора изображения тем, что он влияет не только на одно изображение. (Некоторые операторы имеют смысл только в том случае, если их работа имеет несколько изображений для потребления: подумайте о
-append
,-combine
,-composite
,-morph
...)
Из приведенных выше принципов вы уже можете сделать вывод: порядок параметров командной строки в большинстве случаев значим. (Если вы знаете, что они делают, вы также знаете, какой порядок вы должны использовать, применяя их.)
(Для полноты картины я должен добавить: есть еще один класс разных или других параметров, которые не попадают ни в одну из перечисленных выше категорий. Подумайте -debug
, -verbose
или же -version
.)
К сожалению, четкое различие между тремя классами параметров командной строки IM еще не является общеизвестным среди (в противном случае достаточно опытных) пользователей IM. Так что стоит получить гораздо больше информации.
Это четкое разграничение было введено в основной версии ImageMagick 6. Раньше это было более запутанным: семантика некоторых настроек менялась в зависимости от контекста, а также в порядке их предоставления. Результаты сложных команд не всегда были предсказуемыми, а иногда удивительными и нелогичными. (Теперь они могут быть слишком удивительными, но когда вы внимательно смотрите на них, понимая вышесказанное, они всегда вполне логичны.)
Что есть что?!?
Когда вы не уверены, к какому классу относится один конкретный параметр, запустите
convert -help | less
Ищите свой параметр. Найдя, прокрутите назад: вы должны найти "заголовок", под которым он появляется. Теперь вы можете быть уверены в том, какой это тип: параметр изображения, оператор изображения или оператор последовательности изображений, и принять во внимание то, что я сказал о них выше.
Еще несколько советов
Если ваша работа заключается в переносе интерфейса ImageMagick с PerlMagick на интерфейс командной строки, вы должны знать еще об одном приеме: вы можете вставить
+write output-destination
в любом месте командной строки (даже несколько раз). Затем будет записано текущее загруженное изображение (или текущая загруженная последовательность изображений) в его текущем обработанном состоянии в заданный выходной пункт назначения. (Думайте об этом как нечто похожее на tee
-команда для использования оболочки / терминала, которая перенаправляет копию <stdout>
в файл.) Выходное назначение может быть файлом, или show:
или что-то еще, действительное для выходов IM. После записи в выходной файл обработка всей команды будет продолжена.
Конечно, имеет смысл только вставить +write
после первого (или любого другого) оператора изображения - иначе текущий список изображений не изменится.
Если существует несколько выходных изображений (поскольку текущий список изображений состоит из более чем одного изображения), то ImageMagick автоматически назначит номера индексов для соответствующего имени файла.
Это очень помогает при отладке (или оптимизации, оптимизации, упрощении...) сложных командных настроек.
Выполняются ли операции преобразования слева направо? то есть порядок я передаю им
Да. Если я возьму следующие два примера, которые идентичны, за исключением порядка операций, я могу ожидать разные результаты, основанные слева направо.
convert rose: -sample 300% -wave 5x10 rose_post_wave.png
convert rose: -wave 5x10 -sample 300% rose_pre_wave.png
Вы можете увидеть влияние волновой операции на изображение после или перед сэмплированием изображения.
Что произойдет, если я передам один и тот же вариант дважды? Они выполняются отдельно?
Будет выполнен дважды. Специальной блокировки или автоматического подсчета операций не существует.
convert rose: -blur 0.5x0.5 -scale 300% rose_blur1.png
convert rose: -blur 0.5x0.5 -blur 0.5x0.5 -scale 300% rose_blur2.png