将透明度为PNG的PNG转换为JPG

时间:2017-12-23 17:22:07

标签: image-processing imagemagick imagemagick-convert

  

修改:此问题的原始标题为"使用-flatten选项" 的缺点。但是,在回答了这个问题之后,我决定更改它的标题,以便在Google上找到它。此外,新标题实际上更好地描述了下面的内容。

正如我今天发现的,要将PNG的透明度转换为JPG,我们需要使用-flatten选项。

亲自试用:下载Google logo并使用以下行将其从PNG转换为JPG

convert google.png google.jpg

图片会混乱:

enter image description here

使用-flatten选项,它可以正常工作:

convert google.png -flatten google.jpg

我想知道,对于PNG,JPG / JPEG和GIF之间的所有转换,永久使用-flatten是否有任何弊端。

2 个答案:

答案 0 :(得分:5)

将PNG转换为JPG的问题是PNG具有透明度。 JPG不允许透明度,任何透明区域都会显示透明度下面的颜色,通常是黑色。所以你应该使用-flatten来正确地进行转换。但是如果你不想要默认的背景颜色,你应该在-flatten之前指定-background somecolor。 GIF仅允许二进制透明度 - 完全透明或完全不透明。 PNG允许8位透明(部分透明)。我知道在将PNG或GIF转换为JPG时使用-background xx -flatten没有重大问题。但是,您使用的背景颜色将改变透明区域中的外观与下方颜色的外观。以下是发生的事情:

输入:

enter image description here

关闭alpha:

convert google.png -alpha off google_aoff.jpg

enter image description here

条纹来自Alpha通道下方的下方颜色。

Alpha Channel(很好地抗锯齿):

convert google.png -alpha extract google_alpha.jpg

enter image description here

简单展平(默认背景为白色):

convert google.png -flatten google_flatten.jpg

enter image description here

用黑色背景展平:

convert google.png -background black -flatten google_flatten_black.jpg

enter image description here

通常会重新处理原始透明PNG图像,使其在Alpha通道下方具有一些恒定颜色,以便后来可以删除Alpha通道而不显示奇数颜色。它看起来与原始PNG完全相同。

convert google.png -background white -alpha background google_bg_white.png

enter image description here

但是,如果您只是删除Alpha通道,JPG将显示锯齿,因为只有完全透明像素的背景颜色变为白色。你有一个漂亮干净的背景,但图像仍然是别名(因为它删除了alpha通道时的原始图像。)

convert google_bg_white.png google_bg_white.jpg

enter image description here

因此,仍然需要将结果展平,以便alpha通道的抗锯齿能够平滑地混合边界附近的颜色。

convert google_bg_white.png -flatten google_bg_white_flatten.jpg

enter image description here

-flatten的另一种方法是使用-alpha remove,讨论http://www.imagemagick.org/Usage/masking/#alpha_remove。所以从原始的PNG开始,我们做

convert google.png -background white -alpha remove google_alpharemoveoff.jpg

enter image description here

结果与-background white -flatten相同。我们不需要参考中提到的-alpha off,因为JPG不支持任何alpha通道。该参考文献称这是更有效的,也是首选方法。

答案 1 :(得分:1)

@John C写道:

1st approach:
convert google.png -flatten google_flatten.jpg   

2nd approach:
convert google.png -background white -alpha background google_bg_white.png    
convert google_bg_white.png -flatten google_bg_white_flatten.jpg

3rd approach:
convert google.png -background white -alpha remove google_alpharemoveoff.jpg

更恰当的是,这些应该是

1st approach
convert google.png -background white -flatten google_flatten.jpg

2nd approach
convert google.png -background white -alpha background -flatten google_bg_white_flatten.jpg

3rd approach
convert google.png -background white -alpha remove -alpha off google_alpharemoveoff.jpg


在案例1中: - 背景白色是默认值。但是如果你想要一些其他背景颜色,你需要指定它。

在案例2中:无需保存到中间文件

在案例3中:如果保存到PNG,则需要-alpha off。 JPG不支持透明度,因此不需要关闭alpha。