joh*_* j. 4 imagemagick image-processing imagemagick-convert
编辑:此问题的原始标题为“使用
-flatten选项的缺点”。但是,在回答了这个问题后,我决定更改它的标题,以使其在Google上更容易找到。另外,新标题实际上更好地描述了以下内容。
正如我今天发现的那样,要将具有透明度的PNG转换为JPG,我们需要使用-flattenoption。
自己尝试:下载Google徽标,并使用以下代码行将其从PNG转换为JPG
convert google.png google.jpg
Run Code Online (Sandbox Code Playgroud)
图片将被弄乱:
使用-flatten选项,它可以正常工作:
convert google.png -flatten google.jpg
Run Code Online (Sandbox Code Playgroud)
我想知道-flatten对于PNG,JPG / JPEG和GIF之间的所有转换,永久使用是否有任何缺点。
将PNG转换为JPG的问题是PNG具有透明度。JPG不允许透明,任何透明区域都将显示透明下面的颜色,通常是黑色。因此,您应该使用-flatten正确执行该转换。但是,如果您不希望使用默认的背景色,则应在-flatten之前指定-background somecolor。GIF仅允许二进制透明-完全透明或完全不透明。PNG允许8位透明(部分透明)。我知道在将PNG或GIF转换为JPG时,使用-background xx -flatten不会出现重大问题。但是,您使用的背景色将使透明区域中的外观与底色发生变化。这是正在发生的事情:
输入:
关闭Alpha:
convert google.png -alpha off google_aoff.jpg
Run Code Online (Sandbox Code Playgroud)
条纹来自Alpha通道下方的底色。
Alpha频道(非常抗锯齿):
convert google.png -alpha extract google_alpha.jpg
Run Code Online (Sandbox Code Playgroud)
简单展平(默认背景为白色):
convert google.png -flatten google_flatten.jpg
Run Code Online (Sandbox Code Playgroud)
展平有黑色背景:
convert google.png -background black -flatten google_flatten_black.jpg
Run Code Online (Sandbox Code Playgroud)
通常,一个人会重新处理原始的透明PNG图像,以使其在alpha通道下具有恒定的颜色,以便以后的人可以删除alpha通道而不会显示奇怪的颜色。外观与原始PNG相同。
convert google.png -background white -alpha background google_bg_white.png
Run Code Online (Sandbox Code Playgroud)
但是,如果仅删除Alpha通道,则JPG将显示锯齿,因为只有完全透明的像素的背景颜色更改为白色。您的背景干净利落,但图像仍带有锯齿(与删除Alpha通道时的原始图像一样)。
convert google_bg_white.png google_bg_white.jpg
Run Code Online (Sandbox Code Playgroud)
因此,仍然需要使结果变平,以便Alpha通道的抗锯齿功能可以平滑地融合边界附近的颜色。
convert google_bg_white.png -flatten google_bg_white_flatten.jpg
Run Code Online (Sandbox Code Playgroud)
-flatten的另一种方法是使用-alpha remove,该方法已在http://www.imagemagick.org/Usage/masking/#alpha_remove中进行了讨论。因此,从原始的PNG开始,
convert google.png -background white -alpha remove google_alpharemoveoff.jpg
Run Code Online (Sandbox Code Playgroud)
结果与-background white -flatten相同。我们不需要参考中提到的-alpha off,因为JPG不支持任何alpha通道。参考文献说这是更有效的,是首选方法。