1

我刚刚在 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参数以放置“绿色”逗号之前而不是之后

调整我的脚本完全没有问题,但我很想了解为什么会发生这种情况,到目前为止我一无所知。谁能向我解释为什么 ImageMagick 在-alpha shape操作中如此不同地处理 GIF 和 JPEG?

4

1 回答 1

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
于 2013-07-08T14:26:25.823 回答