将带透明度的PNG转换为JPG

6
我是一名有用的助手,可以为您翻译文本。

编辑:这个问题最初的标题是"使用 -flatten 选项的缺点"。然而,在回答了这个问题之后,我决定更改它的标题,以便在谷歌上更容易找到。此外,新标题实际上更好地描述了下面所说的内容。

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

您可以自己尝试:下载Google标志并使用以下行将其从PNG转换为JPG

convert google.png google.jpg

图片会混乱:

enter image description here

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

convert google.png -flatten google.jpg

我想知道在PNG、JPG/JPEG和GIF之间进行所有转换时,永久使用-flatten是否存在任何缺点。

2个回答

8
将PNG转换为JPG的问题在于,当PNG具有透明度时。JPG不允许透明度,并且任何透明区域都会显示透明下面的颜色,通常是黑色。因此,您应该使用-flatten来正确进行转换。但是,在-flatten之前应指定-background一些颜色,如果您不想要默认背景颜色。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 通道(平滑抗锯齿):
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 相同。由于JPG不支持任何alpha通道,因此我们不需要提到的 -alpha off。参考资料称这种方法更有效,并且是首选方法。

非常感谢。有一件事我不太明白:“通常人们会重新处理原始透明的PNG [...] 你可能会注意到,在透明度下方有修改后的白色背景的PNG显示了一些走样。但是当转换为JPG时,只需删除alpha通道即可消除它。”这种两步方法与仅使用-flatten相比有何优势? - john c. j.
@John C。我也很惊讶那个别名问题,所以我重新查看了我的帖子并发现我张贴的是错误的图片。正确的图片没有别名问题,尽管别名问题仍然需要讨论。因此,我编辑了我的答案来更正那张图片,解释关于别名的问题(在原始图片中),并展示了另一种方法来-展平。 - fmw42
再次感谢 :) 所以,据我所知,有3种方法可以将带透明度的PNG转换为JPG。 我在这里发布了它:https://pastebin.com/raw/RMN0tVp2。 都正确吗? - john c. j.
弗雷德,你知道按照谷歌选择的方式创建图像有什么好处吗?这似乎是一件奇怪的事情... - Mark Setchell
1
@Mark Stechell。不,我不知道他们为什么要那样做。我经常在Photoshop创建的图像中看到这种情况。个人而言,我会创建一个透明背景,然后用所需颜色绘制字母。但也许他们的工具并不那么简单。 - fmw42

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中:-background white是默认值。但如果你想要其他背景颜色,你需要指定它。
在情况2中:不需要保存到中间文件。
在情况3中:如果你保存为PNG格式,你将需要使用-alpha off。JPG不支持透明度,因此关闭alpha不是必需的。

谢谢你再次解释,现在我完全明白了。 - john c. j.
有趣的是,这三种方法中是否存在“最佳方式”?它们都完美地工作,但可能我们应该坚持只使用一种? - john c. j.
选择最高效的那一个。 - fmw42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接