Преобразование сценария Unix ImageMagick в пакетный файл Windows - PullRequest
2 голосов
/ 16 июня 2011

У меня есть следующий скрипт bash (.sh), который прекрасно работает в Unix.Я хотел бы преобразовать в пакетный (.bat) файл для использования с ImageMagick для Windows, но у меня возникли некоторые проблемы с преобразованием.

Оригинальное GIT-репозиторий для сценариев Unix:

https://github.com/AndreyChernyh/imagemagick-filters

Версия ImageMagick для Windows:

http://www.imagemagick.org/download/binaries/ImageMagick-6.7.0-Q16-windows.zip

earlybird.sh :

#!/bin/bash

SOURCE=$1

# Prepare
rm -f result.jpg source_copy.jpg mask.png
convert $SOURCE -fill rgba\(251,243,213,1.0\) -colorize 100% fill.jpg
convert assets/earlybird/mask.png -resize `identify -format "%wx%h" $SOURCE`\! mask.png
cp $SOURCE source_copy.jpg

# Run
convert fill.jpg $SOURCE -compose multiply -gravity center -composite - |
convert - -modulate 101,68,100 - |
convert - -gamma 1.19 - |
convert - -channel red +level 10.5%,100% - |
convert - -modulate 105,120 - |
convert - -modulate 100,83,100 - |
convert - -level 0%,92%,0.92 - |
convert mask.png - -compose ColorBurn -composite - |
convert mask.png - -compose Multiply -composite result.jpg

# Cleanup
rm -f source_copy.jpg fill.jpg

# Open
open $SOURCE result.jpg

Это то, что у меня пока есть, но оно не работает так, как задумано, так как я не уверен, каков пакетный файл, эквивалентный нескольким аргументам командной строки: например, "\" или "|"или это вообще возможно.Я где-то читал, что эквивалентом является символ «^», но опять же, я не уверен на 100%, как правильно его реализовать.

@echo off

set SOURCE=%1

del result.jpg
del source_copy.jpg
del mask.png

convert.exe %SOURCE% -fill rgba(251,243,213,1.0\) -colorize 100% fill.jpg
convert.exe assets\earlybird\mask.png -resize 1024x768 mask.png

copy %SOURCE% source_copy.jpg

convert.exe fill.jpg %SOURCE% -compose multiply -gravity center -composite - ^
convert.exe - -modulate 101,68,100 - ^
convert.exe - -gamma 1.19 - ^
convert.exe - -channel red +level 10.5%,100% - ^
convert.exe - -modulate 105,120 - ^
convert.exe - -modulate 100,83,100 - ^
convert.exe - -level 0%,92%,0.92 - ^
convert.exe mask.png - -compose ColorBurn -composite - ^
convert.exe mask.png - -compose Multiply -composite result.jpg

del source_copy.jpg
del fill.jpg

РАБОЧИЙ КОД:

Это то, что я сделал после применения ответа @ Gabe .Без ошибок и работает без сбоев!

@echo off

set SOURCE=%1

del result.jpg
del source_copy.jpg
del mask.png

conv %SOURCE% -fill rgba(251,243,213,1.0) -colorize 100%% fill.jpg
conv assets\earlybird\mask.png -resize 604x453 mask.png

copy %SOURCE% source_copy.jpg

conv fill.jpg %SOURCE% -compose multiply -gravity center -composite - |^
conv - -modulate 101,68,100 - |^
conv - -gamma 1.19 - |^
conv - -channel red +level 10.5%%,100%% - |^
conv - -modulate 105,120 - |^
conv - -modulate 100,83,100 - |^
conv - -level 0%%,92%%,0.92 - |^
conv mask.png - -compose ColorBurn -composite - |^
conv mask.png - -compose Multiply -composite result.jpg

del source_copy.jpg
del fill.jpg

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

Ты довольно близко.Большие проблемы, которые я вижу, состоят в том, что у вас есть дополнительные \ в rgba(...), вам нужно экранировать знаки % (например, %%), и вам нужно поставить | перед символами продолжения строки (например,|^).Попробуйте это:

@echo off

set SOURCE=%1

del result.jpg source_copy.jpg mask.png

convert.exe %SOURCE% -fill rgba(251,243,213,1.0) -colorize 100%% fill.jpg
convert.exe assets\earlybird\mask.png -resize 1024x768 mask.png

copy %SOURCE% source_copy.jpg

convert.exe fill.jpg %SOURCE% -compose multiply -gravity center -composite - |^
convert.exe - -modulate 101,68,100 - |^
convert.exe - -gamma 1.19 - ^
convert.exe - -channel red +level 10.5%%,100%% - |^
convert.exe - -modulate 105,120 - |^
convert.exe - -modulate 100,83,100 - |^
convert.exe - -level 0%%,92%%,0.92 - |^
convert.exe mask.png - -compose ColorBurn -composite - |^
convert.exe mask.png - -compose Multiply -composite result.jpg

del source_copy.jpg fill.jpg
1 голос
/ 16 июня 2011

Ваш оригинальный сценарий оболочки Unix получает выходные данные из первого cmd конвертирования и передается от одного вызова к следующему через stdout / stdin, что обозначается символами '-'.

Это соглашение для программ unix, что аргумент '-' означает "не ищите имя файла для обработки, просто читайте с ввода std".

Кроме того, говоря о соглашениях, программы DOS используют формат «/ o» (опция) для управления программой. Попробуйте convert.exe /?, чтобы увидеть, получаете ли вы сообщение об использовании или помогите ELSE попробовать convert.exe --help (и другие варианты Unix), просто чтобы понять, какой синтаксис опции использовать.

Что еще более важно, обратите внимание, что в DOS есть программа std, называемая convert.exe, поэтому убедитесь, что ваш PATH сначала настроен на переход к ImageMagick для Windows DIR. Вы сможете сказать, когда вы выполните convert.exe /?, и вы получите опции, которые вы не узнаете.


Оригинальный скрипт использует символ канала для передачи стандартного вывода одной программы в стандартный поток следующей программы. Это одна впечатляющая цепочка!

Мой опыт работы с оболочкой cmd на данный момент очень стар, но когда-то канал DOS мог содержать только 64 КБ. Вы можете столкнуться с этой проблемой. Если это длительные команды, попробуйте запустить отдельное окно и выполните команду dir %TEMP, чтобы увидеть, как создаются файлы каналов. С таким количеством каналов в DOS может возникнуть конфликт имен или какая-то другая проблема.

Итак, выполните простейший случай, convert .. | convert ... (выполняя только часть работы, чтобы посмотреть, работают ли трубы вообще), и соберите оттуда, добавив еще 1 | convert .. по мере продвижения. Если он взрывается через некоторое время, тогда вы точно знаете, где это происходит.

Работает ли первая команда с (...)?

escape-символ \ должен работать нормально, и я вижу, что вы изменили ваши символы пути с / на \, так что это хорошо.

И % имеет особое значение для файлов .bat, чтобы печатать имена переменных, такие как %f%, так что длительное использование % только с числами, с которыми вы можете быть в порядке. Для переменной, подобной% f%, я смог найти только один способ сломать перевод, заключив в кавычки, например, %f\%, что приводит к бесполезному выводу %f\%.

Не идеально, но и .bat программирование.

Надеюсь, это поможет.

...