Как связать преобразования изображений с помощью команды преобразования ImageMagick? - PullRequest
5 голосов
/ 05 июля 2011

У меня есть исходное изображение (скажем, 1600x1200), для которого я хочу создать серию миниатюр с различными разрешениями:

  • 900x0 (то есть означает, что изображение масштабируется пропорциональнодо 900 пикселей в ширину)
  • 700x0
  • 0x550 (т.е. означает, что изображение масштабируется пропорционально высоте 550 пикселей)
  • 0x400
  • 0x150
  • 200x200 (т.е. обрезано и отцентрировано)

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

Используя ImageMagick 6.7.0-10 Я попробовал следующее (используя опцию +write, см. http://www.imagemagick.org/script/command-line-options.php#write), но она не работает, так как команда +write неэффективна для восстановления изображения в исходное состояние:

convert '/tmp/original.jpg'[0] -quality 95 -density 72x72 -resample 72x72 +profile '!xmp,*' -resize '900>' +write '/tmp/900.jpg' -resize '700>' +write '/tmp/700.jpg' -resize '200x' -crop '200x200+0+35' +repage +write '/tmp/200.jpg' -resize 'x550>' +write '/tmp/550.jpg' -resize 'x400>' +write '/tmp/400.jpg' -resize 'x150>' '/tmp/150.jpg'

В качестве альтернативы я попытался сделать следующее (используя +clone и -delete). Кажется, это работает, но, вероятно, может быть сделано более эффективным (возможно, с mpr:, http://www.imagemagick.org/Usage/files/#mpr):

convert 'original.jpg'[0] -quality 95 -density 72x72 -resample 72x72 +profile '!xmp,*' \( +clone -resize 'x150>' -write '150.jpg' \) -delete 1 \( +clone -resize 'x400>' -write '400.jpg' \) -delete 1 \( +clone -resize 'x550>' -write '550.jpg' \) -delete 1 \( +clone -resize '200x' -crop '200x200+0+35' +repage -write '200.jpg' \) -delete 1 \( +clone -resize '700>' -write '700.jpg' \) -delete 1 -resize '900>' '900.jpg'

Может кто-нибудь объяснить, что яя делаю что-то не так в первом примере (с помощью команды +write)? Может ли кто-нибудь предложить какие-либо улучшения, чтобы повысить эффективность использования процессора / памяти?

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

Вот улучшение с помощьюmpr:

convert 'original.jpg'[0] -quality 95 -density 72x72 -resample 72x72 +profile '!xmp,*' -write mpr:orig +delete mpr:orig -resize 'x150>' -write '150.jpg' +delete mpr:orig -resize 'x400>' -write '400.jpg' +delete mpr:orig -resize 'x550>' -write '550.jpg' +delete mpr:orig -resize '200x' -crop '200x200+0+35' +repage -write '200.jpg' +delete mpr:orig -resize '700>' -write '700.jpg' +delete mpr:orig -resize '900>' '900.jpg'

Мне все еще интересно, почему +write не работает.

Ответы [ 2 ]

4 голосов
/ 08 июля 2011

Оказывается, что использование mpr: - это путь (из того, что я видел на форумах и еще много чего):

convert 'original.jpg'[0] -quality 95 -density 72x72 -resample 72x72 +profile '!xmp,*' -write mpr:orig +delete mpr:orig -resize 'x150>' -write '150.jpg' +delete mpr:orig -resize 'x400>' -write '400.jpg' +delete mpr:orig -resize 'x550>' -write '550.jpg' +delete mpr:orig -resize '200x' -crop '200x200+0+35' +repage -write '200.jpg' +delete mpr:orig -resize '700>' -write '700.jpg' +delete mpr:orig -resize '900>' '900.jpg'

ПРИМЕЧАНИЕ: на всякий случай, если вы пропустилиЭто значит, что вам не нужна команда -write для последнего изображения в цепочке.

ТАКЖЕ ПРИМЕЧАНИЕ: важно использовать расширение для выводимых файлов.Если вы его опустите, convert не знает, какой формат он должен использовать при записи (предположительно, потому что сохранение изображения в mpr: уничтожает эту информацию).

3 голосов
/ 31 января 2014

Вы неправильно поняли значение аргумента +write. Он не отменяет обработку вашего изображения, выполненную до операции записи, он отменяет только обработку , вызванную самой операцией записи.

например. Предположим, у вас есть изображение JPG, и вы делаете следующее:

convert original.jpg -scale 50% -write output1.gif output2.jpg

Что произойдет? convert читает original.jpg в память и сжимает его до половины разрешения. Теперь он должен записать его в output1.gif, но, поскольку формат GIF поддерживает только изображения, основанные на палитре, он преобразует изображение в 256 цветов и запишет файл GIF. Теперь он возьмет текущее изображение, которое было уменьшено до 256 цветов, преобразует его обратно в настоящий цвет (24-битный RGB) и запишет его в output2.jpg, поскольку файлы JPG не поддерживают изображения на основе палитры. Тем не менее, JPG будет выглядеть почти так же, как если бы вы конвертировали GIF-файл в JPG (он будет ограничен примерно 256 различными цветами).

Теперь давайте попробуем то же самое снова, но на этот раз мы сделаем следующее:

convert original.jpg -scale 50% +write output1.gif output2.jpg

Что произойдет? convert читает original.jpg в память и сжимает его до половины разрешения. Теперь он должен записать его в output1.gif, однако, без его изменения , это то, что говорит +write, поэтому он сначала клонирует изображение в памяти. Он преобразует клон в 256 цветов и записывает результат в output1.gif. Затем он снова отбрасывает клон и продолжает обработку с изображением, которое имело до клонирования . Это изображение теперь записывается в output2.jpg, что означает, что на этот раз output2.jpg будет уменьшенной версией original.jpg и не будет выглядеть как изображение на основе 256-цветовой палитры.

Ни при каких условиях операция масштабирования не отменяется, поскольку она совершенно не связана с операцией записи. Если вы хотите отменить операцию масштабирования, вам нужно либо сохранить изображение, масштабировать его, записать и затем восстановить, либо клонировать, масштабировать, записать и затем удалить клон. Любой способ должен быть одинаково быстрым, поскольку количество копий, выполняемых в памяти, в обоих случаях одинаково, отличается только синтаксис командной строки.

...