ImageMagick multiple operations in single invocation

Refresh

December 2018

Views

4k time

2

I'm trying to get ImageMagick to perform multiple operations (in this case, crops) in a single invocation, but it doesn't seem to be possible. For example, I can do a crop, rotate, and then another crop as two separate commands:

$ convert test.jpg -crop 223x187+588+757 -rotate 330 crop2.jpg 
$ convert crop2.jpg -crop 200x100+43+87 crop3.jpg

But if I try to combine them into a single command, I get an error:

$ convert test.jpg -crop 223x187+588+757 -rotate 330 -crop 200x100+43+87 crop3.jpg convert: geometry does not contain image `test.jpg' @ warning/transform.c/CropImage/666.

Obviously I could just create a pipe, but if possible I want to avoid the extra overhead of multiple processes. Is there a way to do this?

Update: Also, a pipe seems problematic: I don't want an extra compress/decompress stage so I try piping it as RGB, but I can't seem to get the parameters right:

convert test.jpg -crop 223x187+588+757 -rotate 330 rgb:- | convert -size 287x273 -depth 8 rgb:- -crop 200x100+43+87 crop3.jpg
convert: unexpected end-of-file `-': No such file or directory @ error/rgb.c/ReadRGBImage/231.

Ok, so it turns out the above error is because my calculated size for the image differs from ImageMagick's calculations by two pixels. So obviously having to try to get the image size calculation exactly the same as IM is an extra problem introduced by the need to pipeline the two commands.

2 answers

13

Вот более общий подход к этому вопросу.

ImageMagick предоставляет несколько хитрых трюков, которые могут помочь оптимизировать скорость обработки, когда ...

  1. ... вы хотите обрабатывать большие изображения и
  2. ... если вы хотите создать другой вывод из того же оригинала.

Существуют различные методы, которые даже могут быть объединены:

  1. Воспользуйтесь специальным ImageMagick в mpr:{label}формате и синтаксиса. Это говорит ImageMagick временно сохранить изображение ввода в имени магического регистра программы этикетку. (Я также видел , что это объясняется магической постоянная (память) регистр или регистр памяти программы .) Трубопровод команды может потом (при обработке) читать данные изображения гораздо быстрее , чем оттуда он мог читать с жесткого диска. И команда может читать ее так часто , как вы хотите, несколько раз.
  2. Воспользуйтесь специальным ImageMagick в mpc:{name}формате и синтаксиса. Это работает аналогично mpr:. Его длинное имя является кэш - Магик пикселей . Я также видел , как магическом персистирующий (диск) кэш . MPC является родным в памяти формата несжатого файла ImageMagick, но сбрасывается на диск. После записи на диск, он может быть повторно читать быстрее в память снова , чем JPEG, TIFF или PNG мог, потому что преобразование не требуется.
  3. Построить умную последовательность команд. Используйте «» обработки боковом, используя \( ... \)синтаксис в уцелевших скобках , где это необходимо.

MPC

Когда convertкоманда считывает входное изображение (JPEG, TIFF, GIF, PNG ... любой формат , он может быть в настоящее время), он сначала обрабатывает этот формат в MPC.

Этот результат обработки хранится в памяти в виде несжатого растровом формате. Оттуда дальнейшие преобразования и манипуляция изображения происходят. Если вы хотите записать на диск MPC , как MPC можно использовать +write mpc:myfilename. В основном это просто прямая дамп памяти на диск.

ImageMagick записывает два, а не один, (и больше , чем обычно) бинарные файлы: myfilename.mpcи myfilename.cache. .mpcФайл содержит метаданные изображения, .cacheимеет фактические данные кэша пикселей.

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

Так что это может быть быстрее (особенно для больших изображений) использовать, ЕСЛИ вы не можете избежать написания временных файлов, какие нужно читать снова. Однако, будьте осторожны с места на диске. Не забывайте убирать, как только вы больше не нужны MPC файл на диске. IM не будет автоматически отслеживать ваши +writeкоманды для вас.

(Более технические детали: MPC как формат файл на диске не является переносимым Он также не подходит в качестве долгосрочного формата архив Его единственная пригодность в качестве промежуточного формата для обработки изображений высокой производительности Она требует... Два файлов поддержки один образ. не гарантированно «стабильный» между ImageMagick высвобождает. Он не может работать на другой машине от того, где вы его создали.)

Если вы все еще хотите сохранить этот формат на диск, помните об этом:

  • Графические атрибуты записываются в файл с расширением .mpc .
  • Image пикселей записываются в файл с расширением .cache .

Основные преимущества MPC заключались в том ...

  1. ... обработки очень больших изображений, или когда
  2. ... применение нескольких операций на одном и то же изображение в «эксплуатации трубопроводов» .

MPC был разработан специально для моделей рабочих процессов , которые соответствуют критериям «читать много раз, написать один раз» .

MPR

Формат МНР ( память стойкого регистр ) делает нечто подобное , как ПДК. Это делает изображение доступно через именованный регистр памяти. Вы можете использовать любое имя , которое вы хотите (четные номера). Ваш трубопроводу процесс также может считывать изображение снова из этого регистра - несколько раз даже, если это нужно сделать. Изображение mpr:labelсохраняется в регистре до текущих выходов команд трубопровода. (Это разница к к-диск записывается mpc:filenameЭто сохраняется завершение текущего трубопровода;. Даже выживает система перезагружается.)

команда трубопровода Clever

(Мое использование слова «трубопровод» здесь не следует путать с трубопроводами в оболочке, где несколько команд и процессы запускаются и прикованы. Здесь я говорю только об одном вызове из convertкоторых цепи нескольких манипуляций и операций изображения в один процесс.)

Таким образом, можно выполнить все изменить размер, обрезать, добавлять, цвет миниатюр манипулирования, размытость, ... что-есть-вы операции в одном процессе выписывая различные промежуточные результаты, вам требуется.

Практический пример ...

... хм, я не уверен , если это тааак практично. Я не проверял, я просто использовал мою фантазию построить пример, показывающий принципы относительно использования различных концепций.

Примечание: +write someimageтакое же , как -write someimage +delete.

convert \
    very-very-large.jpg \
   -write mpr:XY \
   +delete \
   -respect-parentheses \
     \( mpr:XY -crop '3000x2001+0+491' -resize '170x116!>'   +write pic1.png   \) \
     \( mpr:XY -crop '2981x2883+8+0'   -resize '75x75!>'     +write pic2.png   \) \
     \( mpr:XY -crop '1100x1983+0+0'   -resize '160x160!>'   +write pic3.png   \) \
     \( mpr:XY -crop '2000x2883+0+0'   -resize '1024x960!>'  +write pic4.png   \) \
     \( mpr:XY -crop '1000x2883+0+0'   -resize '190x188!>'   +write mpr:pic5   \) \
     \( mpr:pic5                                             +write pic5.png   \) \
     \( mpr:XY -crop '3000x2000+0+0'   -resize '2048x2047!>' +write pic6.png   \) \
     \( mpr:XY -crop '3000x2883+0+0'   -resize '595x421!>'   +write pic7.png   \) \
     \( mpr:XY -crop '3000x2883+0+0'   -resize '3000x2883!>' +write mpr:AB     \) \
     \( mpr:AB                                               +write pic8.tiff  \) \
     \( mpr:AB -blur 0x8                                     +write blur1.gif  \) \
     \( mpr:pic5 mpr:AB +append mpr:pic5 -append             +write append.jpg \) \
     \( mpr:pic5 -rotate -130 mpr:AB -gravity center                              \
                 -compose difference -composite +write final.png               \) \
null:

После первой операции, -write mpr:XYесть два изображения в стеке:

  1. входной файл, very-very-large.pngи
  2. его копия , которую можно считывать из памяти , используя его метку XY.

Нам не нужно первые из этих двух больше. Поэтому мы используем , +deleteчтобы удалить его из стека.

Таким образом , эта команда используется один единственный командный конвейер , который осуществил несколько команд и манипуляции , создавая 11 различных выходных изображений на одном дыхании: pic{1,2,3,4,5,6,7}.png, blur1.gif, pic8.tiff, append.jpgи final.png.

6

Quick'n'dirty ответ: Вставьте +repageв свой первый сингл команды:

    convert test.jpg             \
           -crop 223x187+588+757 \
           -rotate 330           \
           +repage               \
           -crop 200x100+43+87   \
            crop3.jpg

Длинный и исчерпывающий ответ: Будет следовать позже. Я должен выполнить еще одно задание первым. Длинный ответ даст вам более общий подход, как вы можете обрезать несколько разделов в одной команде, сохраняя при этом до производительности.