没有中间文件的ImageMagick命令失败

时间:2015-05-25 18:20:12

标签: imagemagick imagemagick-convert

我正在研究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  

导致非常好的图像变暗。即没有添加阴影。直到该步骤,one命令工作得非常好。

此外。如果我在最后一步之前保存图像,请执行以下操作:

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

然后在tempbutton上执行最后一次克隆,如下所示:

convert.exe tempbutton.png
( +clone -background navy -shadow 80x4+4+4 ) +swap -background none -flatten
downloadbutton.png

然后它有效。

如何避免将图像保存为最后一步,并将其作为一个大命令?

1 个答案:

答案 0 :(得分:2)

您指向示例页面的链接不会引导我使用您可能用作模板的内容(说明它的“95%与示例相同”)。

然而,经过一些重新格式化以获得更好的可读性,删除拼写错误以及适应我自己的环境(需要使用反斜杠转义 " (...) " 部分,如下所示: " \( ... \) " ,我在最终的-compose src-over运营商之前插入了额外的-flatten

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操作的工作原理如下:

      

    “使用当前-background颜色创建第一个图像虚拟画布大小的画布,然后将-compose每个图像依次放到该画布上。剪裁掉画布外的图像。最终图像将虚拟画布偏移量为零。“ see IM docu

  5. 图像-compose ...之类的设置会一直持续到完成命令结束,或者直到命令行稍后由另一个-compose ...设置明确更改为止。

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

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

    1. 之前的-compose Multiply设置已不再为人所知。
    2. -compose <something>操作未提供显式 -flatten设置。
    3. 因此,隐式默认-compose src-over用于-flatten
    4. 因此,要将该设置集成到ImageMagick的单个命令中,您必须在写入输出之前通过运行-compose multiply来重置先前的-compose src-over -flatten

      这是比较“之前”(你的命令输出,左)和“之后”(我的命令输出,右边)我提出的修改:

      ButtonTest.png, first attempt by OP ButtonTest.png, with modified command

      你应该在“ImageMagick命令行的架构”主题上学习我以前的答案

      它解释了以下类别的ImageMagick命令行参数的区别。如果要构建具有多个操作的复杂IM命令,要理解这些差异是必不可少的:

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