将 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 通道。参考资料说这种方法效率更高,是首选方法。