【问题标题】:Convert PNG with transparency to JPG将具有透明度的PNG转换为JPG
【发布时间】:2018-06-05 20:56:45
【问题描述】:

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

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

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

convert google.png google.jpg

图片会乱的:

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

convert google.png -flatten google.jpg

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

【问题讨论】:

    标签: image-processing imagemagick imagemagick-convert


    【解决方案1】:

    将 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
    

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

    Alpha 通道(很好的抗锯齿):

    convert google.png -alpha extract google_alpha.jpg
    

    Simple Flatten(默认背景为白色):

    convert google.png -flatten google_flatten.jpg
    

    用黑色背景展平:

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

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

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

    但是,如果您只是移除 Alpha 通道,JPG 将显示锯齿,因为只有完全透明像素的背景颜色更改为白色。您的背景非常干净,但图像仍然有锯齿(就像移除 Alpha 通道时的​​原始图像一样)。

    convert google_bg_white.png google_bg_white.jpg
    

    所以仍然需要对结果进行扁平化,以便 Alpha 通道的抗锯齿能够平滑地混合边界附近的颜色。

    convert google_bg_white.png -flatten google_bg_white_flatten.jpg
    

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

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

    结果与 -background white -flatten 相同。我们不需要参考中提到的 -alpha off,因为 JPG 不支持任何 alpha 通道。参考资料说这种方法效率更高,是首选方法。

    【讨论】:

    • 非常感谢。我不明白的一件事:“通常会重新处理原始透明 PNG [...] 您可能会注意到,在透明度下具有修改的白色背景的 PNG 显示了一些锯齿。但是当简单地转换为 JPG 时会删除 alpha 通道。" 与简单地使用 -flatten 相比,这种两步方法有什么优势吗?
    • @John C。我也对这种混叠感到惊讶。所以我查看了我的帖子,发现我发布了错误的图像。正确的图像没有锯齿,但锯齿问题仍需讨论。因此,我编辑了我的答案以更正该图像,解释了锯齿(在原始图像中),并展示了另一种 -flatten 方法。
    • 再次感谢 :) 所以,据我所知,有 3 种方法可以将 PNG(透明)转换为 JPG。我把它贴在这里:pastebin.com/raw/RMN0tVp2。一切都正确吗?
    • Fred,您知道按照 Google 选择的方式创建图像有什么好处吗?这似乎是一件奇怪的事情......
    • @Mark Stechell。不,我不知道他们为什么那样做。我也经常从 Photoshop 创建的图像中看到这一点。就个人而言,我会创建一个透明背景,然后以所需的颜色绘制字母。但也许他们的工具并没有那么简单。
    【解决方案2】:

    @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。 JPG 不支持透明度,因此不需要关闭 Alpha。

    【讨论】:

    • 再次谢谢你,现在我完全明白了)
    • 有意思,这三者之间有没有“最好的方法”?所有这些都完美无缺,但也许我们应该只坚持一个?
    • 选择效率最高的。
    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2015-05-31
    • 2015-01-26
    • 1970-01-01
    • 2016-04-30
    • 2012-01-29
    相关资源
    最近更新 更多