没有中间文件的 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"

原因是这样的:

  1. -compose <some-composite-operator> 是一个 图像设置

  2. 其默认值为src-over

  3. 您在写入最终结果图像之前使用的 -flatten 运算符只是 -layers flatten 操作的快捷方式。

  4. -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

  5. -compose ... 这样的图像设置一直持续到完整的命令结束,或者直到它们被命令行上的另一个 -compose ... 设置明确更改。

  6. 您之前提供的 -compose Multiply 设置在您执行最终 -flatten (a.k.a. -layers flatten) 时仍然有效。这给出了你看到的输出...

但是,当您 运行 第二个单独的命令来创建按钮时,您将重新开始:

  1. 之前的 -compose Multiply 设置已不为人知。
  2. 未为 -flatten 操作提供 显式 -compose <something> 设置。
  3. 因此,隐式 默认值 -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 命令,了解这些差异是必不可少的:

  1. 图像设置
  2. 图像运算符
  3. 图像序列运算符
  4. 图像堆栈运算符