2011-06-16 107 views
2

我有以下bash脚本(.sh),在Unix中工作得很好。我想转换成一个批处理(.bat)文件,用于Windows的ImageMagick,但是我在转换时遇到了一些麻烦。对于Unix的脚本(S)转换Unix ImageMagick脚本到Windows批处理文件

原GIT回购:

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 

这是我到目前为止,但它不按预期工作,因为我不确定多个命令行参数的批处理文件相当于什么:例如,“\”或“|”或者是否可能。我在某处读到相当于“^”的字样,但我再次确信如何正确实施。

@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

你非常接近。我看到的大问题是,您在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 
+0

得到它的工作,你达人! – fuzz 2011-06-16 06:50:44

1

你原来的UNIX shell脚本正在从第一转换CMD输出,并从一个调用传递到下一个直通标准输出/标准输入,由所标示“ - ”字符。

这是一个unix程序的约定,' - '的参数表示“不寻找要处理的文件名,只需从std输入读取”。另外,就惯例而言,DOS程序使用'/ o'(选项)格式来控制程序。尝试使用convert.exe /?来查看是否得到使用情况消息或帮助其他使用convert.exe --help(以及其他unix变体),以便了解哪些是使用的正确选项语法。

更重要的是,请注意,DOS中有一个名为convert.exe的std程序,因此请确保您的PATH设置为首先转到Windows DIR的ImageMagick。你可以告诉你什么时候做convert.exe /?,你会得到你不认识的选项。


原始脚本使用管道角色将一个程序的标准输出传递到下一个程序的标准输入。这是一个令人印象深刻的链

我对cmd shell的使用经验在这一点上确实很旧,但曾经有一段时间,DOS管道只能容纳64K。你可能会遇到这个问题。如果这些是长时间运行的命令,则尝试运行单独的窗口并执行dir %TEMP以查看正在创建的管道文件。有了这么多管道,DOS可能会有命名冲突或其他问题。

因此,做最简单的案例,convert .. | convert ...(只做一部分工作以查看管道是否工作),并从那里建立起来,并随时添加1个| convert ..。如果它在一段时间后爆炸,那么你确切地知道它发生了什么。

第一个命令是否与(...)一起工作?

escape char \应该可以正常工作,而且我看到您已将路径字符从/改为\,所以这很好。

而且%有.bat文件有特殊的意义,打印变量的名字,如%f%,所以只要使用情况%仅与号码,你可能会确定。对于像%f%这样的变量,我能找到的打破翻译的唯一方法就是引用%f\%,最后给出的是%f\%的无用输出。

不完美,但也不是.bat编程。

我希望这会有所帮助。

+1

@Fulvio:完成了我的许多编辑。 – shellter 2011-06-16 05:11:20

+0

@shelter感谢您的详细信息。它的帮助非常大。 – fuzz 2011-06-16 06:43:53

相关问题