我有以下bash脚本(.sh)在Unix中工作得很好。我想转换成批处理(.bat)文件,以便与ImageMagick for Windows一起使用,但我在转换时遇到了一些麻烦。
Unix脚本的原始GIT仓库:
https://github.com/AndreyChernyh/imagemagick-filters
适用于Windows的ImageMagick版本:
http://www.imagemagick.org/download/binaries/ImageMagick-6.7.0-Q16-windows.zip
#!/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
答案 0 :(得分:2)
你非常接近。我看到的最大问题是你在\
中有额外的rgba(...)
,你需要逃避%
标志(例如%%
),你需要放|
1}}在行连续字符之前(如|^
)。试试这个:
@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 :(得分:1)
您的原始unix shell脚本正在从第一个转换cmd获取输出并从一个调用传递到下一个thru stdout / stdin,如' - '字符所示。
这是unix程序的惯例,“ - ”的参数意味着“不要查找要处理的文件名,只需从std输入中读取”。
另外,谈到约定,DOS程序使用'/ o'(选项)格式来控制程序。尝试使用convert.exe /?
来查看是否获得了使用消息或帮助ELSE尝试convert.exe --help
(以及其他unix变体),以便了解哪个是正确的选项语法。
更重要的是,请注意DOS中有一个名为convert.exe的std程序,因此请确保您的PATH设置为首先转到ImageMagick for Windows DIR。您可以告诉您何时执行convert.exe /?
并获得您无法识别的选项。
原始脚本使用管道符将一个程序的stdout传递给下一个程序的stdin。那是一个令人印象深刻的链条!
我对cmd shell的体验在这一点上确实很老,但有一次,DOS管道只能容纳64K。您可能遇到此问题。如果这些是长时间运行的命令,则尝试运行单独的窗口并执行dir %TEMP
以查看正在创建的管道文件。有这么多管道,DOS可能会有命名冲突或其他问题。
所以,做最简单的情况,convert .. | convert ...
(完成部分工作以查看管道是否正常工作),并从那里进行构建,然后再添加1个| convert ..
。如果它在一段时间后爆炸,那么你就知道它到底发生了什么。
第一个带有(...)
的命令是否有效?
转义字符\
应该可以正常工作,我看到您已将路径字符从/
转换为\
,这样做很好。
并且%
对.bat文件有特殊含义,可以打印%f%
之类的变量名称,因此%
的长期使用只有数字才可以。对于像%f%这样的变量,我可以找到打破翻译的唯一方法是引用%f\%
,这最终会给你%f\%
的无效输出。
不完美,但也不是.bat编程。
我希望这会有所帮助。