没有中间文件的 ImageMagick 命令失败
ImageMagick command without intermediary file fails
我正在研究 ImageMagick 中名为 "Gel" 对 ImageMagick Example pages 的影响的示例。
我不想使用中间图像在许多步骤中执行 ImageMagick 脚本,我想在没有中间文件的情况下一步完成。
我的代码如下所示(95% 与示例相同):
convert.exe -size 150x64 xc:none -fill green
-draw "roundrectangle 10,10 140,54 8,8"
( +clone -alpha extract -blur 0x12 -shade 110x0
-normalize -sigmoidal-contrast 16,60% -evaluate multiply .5
-roll +4+8 +clone -compose Screen -composite ) -compose In -composite
( +clone -alpha extract -blur 0x2 -shade 0x90 -normalize -blur 0x2
+level 60,100% -alpha On ) -compose Multiply -composite
-font Verdana-Bold -pointsize 20 -fill white -stroke black -gravity Center
-annotate 0 "Download" -trim -repage 0x0+7+7
( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten
ButtonTest.png"
这些步骤是示例中步骤的副本。
问题是最后一个克隆步骤:
( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten
使原本非常漂亮的图像变暗。 IE。没有添加阴影。直到那一步,一个命令工作得很好。
此外。如果我保存最后一步之前的图像,像这样:
convert.exe -size 150x64 xc:none -fill green
-draw "roundrectangle 10,10 140,54 8,8"
( +clone -alpha extract -blur 0x12 -shade 110x0
-normalize -sigmoidal-contrast 16,60% -evaluate multiply .5
-roll +4+8 +clone -compose Screen -composite ) -compose In -composite
( +clone -alpha extract -blur 0x2 -shade 0x90 -normalize -blur 0x2
+level 60,100% -alpha On ) -compose Multiply -composite
-font Verdana-Bold -pointsize 20 -fill white -stroke black -gravity Center
-annotate 0 "Download" -trim -repage 0x0+7+7
tempbutton.png
然后在临时按钮上执行最后一个克隆,如下所示:
convert.exe tempbutton.png
( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten
downloadbutton.png
然后就可以了。
如何避免将图像保存为最后一步,并发出这个大命令?
您的示例页面 link 并没有引导我找到您可能用作模板的内容(说明它 “与示例 95% 相同”)。
然而,为了更好的可读性,为了消除拼写错误和适应我自己的环境(需要 " (...) "
部分用反斜杠转义,例如这个:" \( ... \) "
,我在最后的 -flatten
运算符之前插入了一个额外的 -compose src-over
:
convert -size 150x64 xc:none -fill green -draw "roundrectangle 10,10 140,54 8,8" \
\
\( +clone -alpha extract -blur 0x12 -shade 110x0 \
-normalize -sigmoidal-contrast 16,60% -evaluate multiply .5 \
-roll +4+8 +clone -compose Screen -composite \
\) \
\
-compose In -composite \
\
\( +clone -alpha extract -blur 0x2 -shade 0x90 -normalize -blur 0x2 \
+level 60,100% -alpha On \
\) \
\
-compose Multiply -composite \
-font Verdana-Bold -pointsize 20 -fill white -stroke black -gravity Center \
-annotate 0 "Download" -trim -repage 0x0+7+7 \
\
\( +clone -background navy -shadow 80x4+4+4 \
\) \ \
+swap -background none -compose src-over -flatten \
"ButtonTest.png"
原因是这样的:
-compose <some-composite-operator>
是一个 图像设置。
其默认值为src-over
。
您在写入最终结果图像之前使用的 -flatten
运算符只是 -layers flatten
操作的快捷方式。
-layers flatten
操作是这样的:
"Create a canvas the size of the first images virtual canvas using the current -background
color, and -compose
each image in turn onto that canvas. Images falling outside that canvas is clipped. Final image will have a zero virtual canvas offset." see IM docu
像 -compose ...
这样的图像设置一直持续到完整的命令结束,或者直到它们被命令行上的另一个 -compose ...
设置明确更改。
您之前提供的 -compose Multiply
设置在您执行最终 -flatten
(a.k.a. -layers flatten
) 时仍然有效。这给出了你看到的输出...
但是,当您 运行 第二个单独的命令来创建按钮时,您将重新开始:
- 之前的
-compose Multiply
设置已不为人知。
- 未为
-flatten
操作提供 显式 -compose <something>
设置。
- 因此,隐式 默认值
-compose src-over
用于 -flatten
。
因此,要将该设置集成到 ImageMagick 的单一命令中,您必须在写入输出之前通过 运行ning -compose src-over -flatten
重置先前的 -compose multiply
。
这里是比较 "before"(你的命令的输出,左)和 "after"(我的命令的输出,右)我提出的修改:
你应该在这里研究我之前关于 "The Architecture of the ImageMagick Command Line" 主题的回答:
- ImageMagick Command-Line Option Order (and Categories of Command-Line Parameters)
它解释了以下ImageMagick命令行参数类别的区别。如果您想构建具有多个操作的复杂 IM 命令,了解这些差异是必不可少的:
- 图像设置
- 图像运算符
- 图像序列运算符
- 图像堆栈运算符
我正在研究 ImageMagick 中名为 "Gel" 对 ImageMagick Example pages 的影响的示例。
我不想使用中间图像在许多步骤中执行 ImageMagick 脚本,我想在没有中间文件的情况下一步完成。
我的代码如下所示(95% 与示例相同):
convert.exe -size 150x64 xc:none -fill green
-draw "roundrectangle 10,10 140,54 8,8"
( +clone -alpha extract -blur 0x12 -shade 110x0
-normalize -sigmoidal-contrast 16,60% -evaluate multiply .5
-roll +4+8 +clone -compose Screen -composite ) -compose In -composite
( +clone -alpha extract -blur 0x2 -shade 0x90 -normalize -blur 0x2
+level 60,100% -alpha On ) -compose Multiply -composite
-font Verdana-Bold -pointsize 20 -fill white -stroke black -gravity Center
-annotate 0 "Download" -trim -repage 0x0+7+7
( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten
ButtonTest.png"
这些步骤是示例中步骤的副本。
问题是最后一个克隆步骤:
( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten
使原本非常漂亮的图像变暗。 IE。没有添加阴影。直到那一步,一个命令工作得很好。
此外。如果我保存最后一步之前的图像,像这样:
convert.exe -size 150x64 xc:none -fill green
-draw "roundrectangle 10,10 140,54 8,8"
( +clone -alpha extract -blur 0x12 -shade 110x0
-normalize -sigmoidal-contrast 16,60% -evaluate multiply .5
-roll +4+8 +clone -compose Screen -composite ) -compose In -composite
( +clone -alpha extract -blur 0x2 -shade 0x90 -normalize -blur 0x2
+level 60,100% -alpha On ) -compose Multiply -composite
-font Verdana-Bold -pointsize 20 -fill white -stroke black -gravity Center
-annotate 0 "Download" -trim -repage 0x0+7+7
tempbutton.png
然后在临时按钮上执行最后一个克隆,如下所示:
convert.exe tempbutton.png
( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten
downloadbutton.png
然后就可以了。
如何避免将图像保存为最后一步,并发出这个大命令?
您的示例页面 link 并没有引导我找到您可能用作模板的内容(说明它 “与示例 95% 相同”)。
然而,为了更好的可读性,为了消除拼写错误和适应我自己的环境(需要 " (...) "
部分用反斜杠转义,例如这个:" \( ... \) "
,我在最后的 -flatten
运算符之前插入了一个额外的 -compose src-over
:
convert -size 150x64 xc:none -fill green -draw "roundrectangle 10,10 140,54 8,8" \
\
\( +clone -alpha extract -blur 0x12 -shade 110x0 \
-normalize -sigmoidal-contrast 16,60% -evaluate multiply .5 \
-roll +4+8 +clone -compose Screen -composite \
\) \
\
-compose In -composite \
\
\( +clone -alpha extract -blur 0x2 -shade 0x90 -normalize -blur 0x2 \
+level 60,100% -alpha On \
\) \
\
-compose Multiply -composite \
-font Verdana-Bold -pointsize 20 -fill white -stroke black -gravity Center \
-annotate 0 "Download" -trim -repage 0x0+7+7 \
\
\( +clone -background navy -shadow 80x4+4+4 \
\) \ \
+swap -background none -compose src-over -flatten \
"ButtonTest.png"
原因是这样的:
-compose <some-composite-operator>
是一个 图像设置。其默认值为
src-over
。您在写入最终结果图像之前使用的
-flatten
运算符只是-layers flatten
操作的快捷方式。-layers flatten
操作是这样的:"Create a canvas the size of the first images virtual canvas using the current
-background
color, and-compose
each image in turn onto that canvas. Images falling outside that canvas is clipped. Final image will have a zero virtual canvas offset." see IM docu像
-compose ...
这样的图像设置一直持续到完整的命令结束,或者直到它们被命令行上的另一个-compose ...
设置明确更改。您之前提供的
-compose Multiply
设置在您执行最终-flatten
(a.k.a.-layers flatten
) 时仍然有效。这给出了你看到的输出...
但是,当您 运行 第二个单独的命令来创建按钮时,您将重新开始:
- 之前的
-compose Multiply
设置已不为人知。 - 未为
-flatten
操作提供 显式-compose <something>
设置。 - 因此,隐式 默认值
-compose src-over
用于-flatten
。
因此,要将该设置集成到 ImageMagick 的单一命令中,您必须在写入输出之前通过 运行ning -compose src-over -flatten
重置先前的 -compose multiply
。
这里是比较 "before"(你的命令的输出,左)和 "after"(我的命令的输出,右)我提出的修改:
你应该在这里研究我之前关于 "The Architecture of the ImageMagick Command Line" 主题的回答:
- ImageMagick Command-Line Option Order (and Categories of Command-Line Parameters)
它解释了以下ImageMagick命令行参数类别的区别。如果您想构建具有多个操作的复杂 IM 命令,了解这些差异是必不可少的:
- 图像设置
- 图像运算符
- 图像序列运算符
- 图像堆栈运算符