我刚刚在 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 显示为白色。
重现:
- 转到http://karenswhimsy.com/public-domain-images/animal-silhouettes/animal-silhouettes-1.shtm并下载大象剪影为
elephant.jpg
- 下载http://www.arthursclipart.org/silhouettes/animals/DUCK1.gif为
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
参数以放置“绿色”在逗号之前而不是之后。
调整我的脚本完全没有问题,但我很想了解为什么会发生这种情况,到目前为止我一无所知。谁能向我解释为什么 ImageMagick 在-alpha shape
操作中如此不同地处理 GIF 和 JPEG?