将Unix ImageMagick脚本转换为Windows批处理文件

将Unix ImageMagick脚本转换为Windows批处理文件,windows,unix,command-line,batch-file,imagemagick,Windows,Unix,Command Line,Batch File,Imagemagick,我有以下bash脚本(.sh),它在Unix中运行良好。我想将其转换为批处理(.bat)文件,以便与ImageMagick for Windows一起使用,但在转换过程中遇到了一些问题 Unix脚本的原始GIT repo: 适用于Windows的ImageMagick版本: : #!/bin/bash SOURCE=$1 # Prepare rm -f result.jpg source_copy.jpg mask.png convert $SOURCE -fill rgba\(251,

我有以下bash脚本(.sh),它在Unix中运行良好。我想将其转换为批处理(.bat)文件,以便与ImageMagick for Windows一起使用,但在转换过程中遇到了一些问题

Unix脚本的原始GIT repo:

适用于Windows的ImageMagick版本:

#!/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
工作代码:

#!/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
这就是我在应用了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

原始unix shell脚本从第一个convert cmd获取输出,并通过stdout/stdin从一个调用传递到下一个调用,如“-”字符所示

unix程序的惯例是,参数“-”表示“不查找要处理的文件名,只从std输入读取”

另外,说到约定,DOS程序使用“/o”(选项)格式来控制程序。请尝试
convert.exe/?
查看您是否收到使用信息或帮助,或者尝试
convert.exe--help
(以及其他unix变体),以便您了解要使用的正确选项语法

更重要的是,注意DOS中有一个名为convert.exe的std程序,因此请确保您的路径设置为先转到ImageMagick for Windows目录。当您执行
convert.exe/?
操作时,您将能够识别出您无法识别的选项


原始脚本使用管道字符将一个程序的stdout传递给下一个程序的stdin。这是一条令人印象深刻的链条

在这一点上,我使用cmdshell的经验非常古老,但有一段时间,DOS管道只能容纳64K。您可能遇到了这个问题。如果这些是长时间运行的命令,请尝试运行单独的窗口,并执行
dir%TEMP
以查看正在创建的管道文件。由于管道太多,DOS可能存在命名冲突或其他问题

那么,做一个最简单的例子,
convert转换…
(只做部分工作以查看管道是否工作),然后从那里开始构建,在运行过程中再添加1个
|转换…
。如果一段时间后它爆炸了,那么你确切地知道它发生在哪里

第一个包含
(…)
的命令是否有效

转义字符
\
应该可以正常工作,我看到您已经将路径字符从
/
转换为
\
,所以这很好

%
对于.bat文件有特殊的意义,可以打印变量名,如
%f%
,因此只要
%
只使用数字,就可以了。对于像%f%这样的变量,我能找到的打破转换的唯一方法是引用像
%f\%
这样的内容,这最终会给您提供
%f\%
这样的无用输出

不完美,但也不完美。蝙蝠编程


我希望这会有帮助。

你很接近了。我看到的最大问题是,在
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

@谢谢你提供的详细信息。这起到了巨大的作用。