2016-09-26 119 views
0

这个问题以前已经问过,但批准的答案不为我工作:如何强制Imagemagick以RGB格式输出灰度图像?

Prevent ImageMagick converting to grayscale

ImageMagick: convert keeps changing the colorspace to Gray. How to preserve sRGB colorspace?

示例图片:

convert.exe logo: -type grayscalealpha png32:-|convert - -define png:color-type=6 png32:-|identify -verbose - 

只有这样,才能迫使我想要在可见区域的某处绘制颜色。这完成了我想要做的事情:

convert.exe logo: -type grayscalealpha png32:-|convert - -fill #11000000 -draw "rectangle 0,0 0,0" -|identify -verbose - 

但是,我宁愿不改变图像。我试过在按照上述基础上的Win7:

的ImageMagick 7.0.3-1 Q16 64 2016年9月20日
的ImageMagick 6.9.0-10 Q16 64 2015年2月28日

谢谢您!

编辑:刚才意识到我在顶部画一个清晰的像素,所以图像不应该改变,但它仍然有效。尽管如此,仍然感觉像一个黑客。

更新:

一些这方面的更多小时的工作后,我发现我的问题是不明确的,因为我不是PNG格式的存储方式明确。

问题:当ImageMagick只有灰色(R = G = B)的图像时,它只会存储图像,我认为只有一个通道(灰色)。

我说“我认为”是因为识别打印出类型为“GrayscaleAlpha”,并且只列出了“灰色”和“Alpha”通道。第二个命令的输出将列出类型为“PaletteAlpha”并列出红色,绿色,蓝色和Alpha。然而,属性“png:IHDR.color-type”对于两者都是6。所以我想我可能会误解ImageMagick使用的“Type”和“Base Type”的含义。

(此外,ImageMagick的V6和V7似乎与此不同的行为。例如,V6列表Alpha通道1位,即使它是8位。)

回答

1

我不知道是什么实际问题是/。我想,从你的问题的标题,你想要的Type:GrayscaleColorspace:sRGB的输出图像,你可以得到这样的:

convert logo: -colorspace gray -define png:-color-type=6 a.png; identify -verbose a.png | grep -E "Type:|Colorspace:" 

输出

Type: Grayscale 
Colorspace: sRGB 

正因为如此,你将覆盖你PNG32:灰度,并迫使它GrayscaleAlpha:

convert logo: -colorspace gray -define png:-color-type=6 PNG32:a.png; identify -verbose a.png | grep -E "Type:|Colorspace:" 

输出

Type: GrayscaleAlpha 
Colorspace: sRGB 
+0

对不起,我感到困惑。我希望类型是“TrueColor”。在这一点上我不关心alpha层或色彩空间。 –

+0

我认为这是同样的问题http://stackoverflow.com/a/35010805/2836621也许@格伦 - 兰德斯佩赫森将能够摆脱一些光... –

+0

“属性”的PNG:IHDR.color-类型“是6,这两个都告诉你图像是如何存储在你的PNG文件中的,”6“表示RGBA,这是你想要的,”identify“报告的颜色空间反映了图像的内容;如果所有像素都是灰色的即使存储为RGBA,“识别”报告“灰度”。如果您必须让ImageMagick认为它是RGBA(为什么?),您必须在其中放置一个彩色像素,就像您已经观察到的那样。 –