我刚刚在ImageMagick中遇到了意外行为,我希望有人可以向我解释。
版本号
$ convert --version
Version: ImageMagick 6.7.7-10 2013-02-25 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP
在Linux Mint 15 Olivia上运行(基于Ubuntu 13.04“Raring Ringtail”)。
执行摘要
使用两个应该非常相似的图像运行相同的操作,除了一个是GIF而另一个是JPEG,结果输出完全不同。 GIF显示为黑色,JPEG显示为白色。
要重现:
elephant.jpg
DUCK1.gif
convert elephant.jpg -negate -alpha shape output-elephant.png
convert DUCK1.gif -negate -alpha shape output-duck.png
output-elephant.png
和output-duck.png
图片有谁可以解释为什么这两个输出图像不同?为什么GIF鸭子在转换后会变成黑色,而JPEG大象在转换后会变成白色?
冗长的解释
情况如下:我想拍摄一些黑白图像,将背景透明,并将前景变成不同颜色。例如,从http://karenswhimsy.com/public-domain-images/animal-silhouettes/images/animal-silhouettes-1.jpg处的大象剪影开始(我将图像保存为elephant.jpg
),我想生成一个透明背景的.png和一个绿色,红色,黄色或其他大象我想要的颜色。
我用来执行此操作的命令是:
convert elephant.jpg -negate -alpha shape +level-colors ,green green-elephant.png
这正是我想要的。首先,它反转图像,使背景为黑色,大象为白色,因为-alpha shape
需要一个alpha蒙版,其中黑色=完全透明,白色=完全不透明。然后-alpha shape
发挥其魔力并在透明背景下产生一头白象。然后+level-colors ,green
开始,将黑白渐变转换为指定为+level-colors
的参数的两种颜色;这里,第一种颜色被省略,因此它将保持黑色,第二种颜色是白色变成的颜色。这会产生一个边界光滑的绿色大象 - 这正是我想要的结果 - 而且我很满意。
接下来,我尝试针对http://www.arthursclipart.org/silhouettes/animals.htm中的一个图像运行相同的命令(我使用DUCK1.gif
)。输入源是相同的 - 白色背景下的黑色轮廓 - 所以我期望相同的结果,绿色鸭子对着透明背景。但它没有用。一项小小的研究表明-alpha shape
行为不同。在JPEG大象的情况下,它在透明背景下产生一头白象,与GIF鸭子相同的命令是在透明背景下产生黑鸭。换句话说,-alpha shape
正在使用GIF图像源反转结果,但不使用JPEG图像源反转结果。因此,为了正确地为动物着色,我需要重写+level-colors
参数,在逗号之前放置“green”,而不是在之后放置。
调整我的剧本完全没问题,但我很想理解为什么这种情况正在发生,到目前为止,我一无所知。任何人都可以向我解释为什么ImageMagick在-alpha shape
操作中如此区别地处理GIF和JPEG?
答案 0 :(得分:1)
无论如何,将DUCK1.GIF转换为DUCK1.JPG会产生与大象相似的图像。此外,您可以确保使用相同的背景颜色和适当的Imagemagick选项。下面的两个命令产生类似的输出:
convert DUCK1.jpg -background Black -negate -alpha shape output-duck.png
convert elephant.jpg -background Black -negate -alpha shape output-elephant.png