ImageMagick以-alpha形状不同地处理JPG和GIF

时间:2013-07-08 13:17:16

标签: imagemagick png jpeg gif imagemagick-convert

我刚刚在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显示为白色。

要重现:

有谁可以解释为什么这两个输出图像不同?为什么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?

1 个答案:

答案 0 :(得分:1)

好吧,我想这就是故事。使用GIF,可以明确定义背景颜色,我认为DUCK1.GIF就是这种情况。 JPEG不是这样;在这里,我认为背景是“白色”。

无论如何,将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