曾经有这样的困惑:
ImageMagick 的命令,如convert命令,如果相继多次使用,并且前一次的输出是后一次的输入,并且不通过文件的方式,该怎么做?
看了Fred's ImageMagick Scripts 的一些图像特效的说明,如TEXTCLEANER,答案是这样的:
TEXTCLEANER 页面最后的文字提到,这个脚本等价于下面的命令
convert \( $infile -colorspace gray -type grayscale -contrast-stretch 0 \) \ \( -clone 0 -colorspace gray -negate -lat ${filtersize}x${filtersize}+${offset}% -contrast-stretch 0 \) \ -compose copy_opacity -composite -fill "$bgcolor" -opaque none +matte \ -deskew 40% -sharpen 0x1 $outfile事实上,这里的convert 命令操作了下面两个输入对象:
\( $infile -colorspace gray -type grayscale -contrast-stretch 0 \)
\( -clone 0 -colorspace gray -negate -lat ${filtersize}x${filtersize}+${offset}% -contrast-stretch 0 \)
操作的参数是:
-compose copy_opacity -composite -fill "$bgcolor" -opaque none +matte -deskew 40% -sharpen 0x1
输出是:
$outfile
输入的两个对象,第一个是对输入文件 $infile 做了 -colorspace gray -type grayscale -contrast-stretch 0 操作的结果;第二个是 对输入文件clone 过的对象做了 -colorspace gray -negate -lat ${filtersize}x${filtersize}+${offset}% -contrast-stretch 0 操作的结果。这两个操作结果都是中间计算结果,最终的输出是 $outfile。
这个脚本的等价物告诉我们,ImageMagick 的命令,如convert,是可以有非文件形式的中间变量的,它是通过左右括号,"(" 和")"来实现的。ImageMagick 的wand/convert.c 也印证了这一点:ImageMagick 根据判断convert 命令参数中的左括号做“入栈”操作,根据右括号来做“出栈”操作的,同一个对象的多个副本,是通过 -clone 参数来实现的。
下面再给一个例子,它结合了 TEXTCLEANER 和 2COLORTHRESH 二者的功能:对mf-samll.jpg 消除背景噪音,文字旋转至水平,然后再做二值化,最终保存为mf-small-out.gif
convert \( \( mf-small.jpg -colorspace gray -type grayscale -contrast-stretch 0 \) \ \( -clone 0 -colorspace gray -negate -lat 25x25+10% -contrast-stretch 0 \) \ -compose copy_opacity -composite -fill "white" -opaque none +matte -deskew 40% -sharpen 0x1 \) \ +dither -colors 2 -colorspace gray -contrast-stretch 0 mf-small-out.gif
TEXTCLEANER 脚本等价命令行供参考:
convert \( $infile -colorspace gray -type grayscale -contrast-stretch 0 \) \ \( -clone 0 -colorspace gray -negate -lat ${filtersize}x${filtersize}+${offset}% -contrast-stretch 0 \) \ -compose copy_opacity -composite -fill "$bgcolor" -opaque none +matte \ -deskew 40% -sharpen 0x1 $outfile
convert $infile +dither -colors 2 -colorspace gray -contrast-stretch 0 $outfile
注意:
命令行中的"\(" 和 "\)" 前后都要有空格,否则ImageMagick 命令不认!