用白色背景替换PNG图像中的透明度

403

我有一张带有alpha通道(即透明度)的PNG图像,我需要创建一个将图像层组合到白色背景上的版本。我想使用可编写命令的CLI工具(例如Image Magick)直接将PNG转换为无损PNG。

以下是一个不起作用的Image Magick命令示例,它会导致错误:

convert input.png -background white -flatten output.png

在我的特定情况下,PNG 中的透明图层在通过 (Apache) FO 处理器创建 PDF/A 时会发生冲突。PDF/A 不允许使用透明效果。我使用的解决方法是改用 JPG 格式。 - Wivani
5
这导致出现错误。 请问这个错误信息是什么? - Aaron McDaid
那个命令应该可以正常工作。如果不能,那么你可能安装的Imagemagick或libpng有缺陷,或者它们的版本太旧了。你的Imagemagick和libpng版本是多少? - fmw42
17个回答

524
-background white -alpha remove -alpha off

例子:

convert image.png -background white -alpha remove -alpha off white.png

随意将white替换为您想要的任何其他颜色。Imagemagick文档对-alpha remove操作有以下说明:

该操作简单快捷,能够完成任务而无需使用额外的内存或与其他透明度去除技术可能相关的其他副作用。因此,这是首选的去除图像透明度的方法。


3
似乎不需要使用-background white(尽管对于其他颜色可能需要)。 - Skippy le Grand Gourou
11
@SkippyleGrandGourou:这是必要的,因为PNG透明度回退颜色并不总是白色。 - Rok Kralj
5
比被接受的答案更好(在多层情况下,被接受的答案做得不对)。 - axkibe
9
生成的图像仍将具有alpha通道。它会是空的,但仍将存在。要完全删除通道,请添加“-alpha off”。 - josch
2
无法工作。我制作了一个带有透明背景和中间红点的新PNG图像。无论我指定什么颜色,它总是产生黑色背景。 convert image.png -background white -alpha off white.png 生成了一个带有黑色背景的图像。 convert image.png -background "#00ff33" -alpha off 00ff33.png 也生成了一个黑色背景。 - McNulty
显示剩余10条评论

310

3
对我来说,这似乎不起作用... 我尝试了“-transparent-color white”,但出现了异常/警告。 - William Niu
1
结果发现我还需要将-background设置为白色。我还不得不下载缺失的colors.xml文件。 - William Niu
11
请看下面我的回答,它是在这个回答发布两年后添加的。 - Rok Kralj
51
不要使用“-flatten”选项尝试转换多页文档,它会将页面压缩成一张纸。 - Tim S.
9
如果您想对文件夹中的所有文件进行操作,可以使用以下方法:mogrify -flatten *.png。为了安全起见,请不要忘记备份。更多信息请参阅:https://www.imagemagick.org/script/mogrify.php - tro
显示剩余4条评论

48

在ImageMagick中,将图像扁平化并应用背景图像很简单。

然而,指令的顺序非常重要。

要在透明图像上应用任何背景并将其压平,请先应用背景,然后再将其压平。反过来则行不通。

$ convert sourceimage.png -background BackgroundColor -flatten destinationimage.png

出于某种原因,这对我来说很好用。不确定为什么你最初的尝试没有成功。 - Anthony

23

对我起作用的唯一方法是将所有答案混合在一起:

convert in.png -background white -alpha remove -flatten -alpha off out.png

5
好的,没问题。这个可以,实际上我需要的颜色不是白色,你可以使用 ... -background "#010203" ... 代替使用白色。 - Alexis Wilke
以下是如何在目录中的所有文件夹中替换相同图像的命令:mogrify -background white -flatten */*.png - Julian
1
“-alpha remove” 对我来说起了作用。 - Stefan Dragnev

19

以下是如何将目录中所有文件夹中相同的图像替换为白色而不是透明的方法:

mogrify -background white -flatten */*.png


11
使用-flatten让我彻底疯了,因为在与mogrify裁剪和调整大小结合使用时,-flatten根本不起作用。官方并且对我来说唯一正确的方法是"删除"阿尔法通道。
-alpha remove -alpha off (不需要用于JPG)
请参见文档:http://www.imagemagick.org/Usage/masking/#remove

那么命令应该怎么写呢?这个在这里不起作用:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png - Aquarius Power
我只想去掉字母,转换为JPG格式就可以了,非常简单易行。感谢您的提示。 - Roger C S Wernersson
这是上述问题中唯一对我有效的解决方案。现在iTunes商店已经接受了我的图片。 - Bill Cheswick

7

Alpha Remove 部分的 ImageMagick 使用指南 建议使用 -alpha remove 选项,例如:

convert in.png  -background white  -alpha remove  out.png

使用您选择的-background颜色。

指南说明:

这个操作简单快捷,可以在不需要任何额外内存使用或其他可能与替代透明度去除技术相关的副作用的情况下完成工作。因此,这是删除图像透明度的首选方式。

它还补充了注意事项:

请注意,虽然透明度被“删除”,但Alpha通道仍将保持打开状态,但现在将完全不透明。如果您不再需要Alpha通道,则可以使用Alpha Off来禁用它。

因此,如果您不需要Alpha通道,可以通过添加-alpha off选项使输出图像大小更小,例如:

convert in.png  -background white  -alpha remove  -alpha off  out.png

从图像中去除透明度部分中,还有其他常用技术去除透明度的更多细节。

该部分还提到了使用-flatten作为去除透明度技术时的一个重要注意事项:

然而,这种方法无法与“mogrify”或多个图像序列一起使用,因为“-flatten”运算符实际上是设计用于将多个图像合并成单个图像。

因此,如果您要同时转换多个图像,例如从PDF文件生成缩略图,则-flatten将无法实现您想要的效果(它将把所有页面的所有图像压缩成一个图像)。另一方面,使用-alpha remove技术仍将产生多个图像,每个图像都去除了透明度。


5

看起来你的命令是正确的,所以问题可能是由于缺少对PNG格式的支持。你可以使用 convert -list configure 命令进行检查,或者尝试以下操作:

sudo yum install libpng libpng-devel

1
是的,谢谢;这个(旧)问题是“图形魔术”中的一个漏洞,它是“图像魔术”的一个分支/重写/任何东西。 - Pointy
@Pointy 我明白了!出于好奇,问题的真正原因是什么呢(仅出现在一个版本中)? - Alastair
我真的不知道确切的情况,这只是一个 bug。我不是 Graphicks Magick 的维护者,所以对他们的代码没有深入了解。我想我需要再试一次。 - Pointy
Ubuntu没有吗?这里有libpng12-0,但仍然不起作用 :( - Aquarius Power
我正在使用安装并运行良好的 libpng12-0 的 Ubuntu 13.04。如果你运行这个命令,你能看见 png 吗? convert -list configure | grep \png - Alastair

5
这不是你问题的确切答案,但我在尝试弄清楚如何删除alpha通道时找到了你的问题,所以我决定在这里添加这个答案:
如果你想使用imagemagick删除alpha通道,你可以使用以下命令:
mogrify -alpha off ./*.png

3

看起来我选择安装“graphics magick”而不是“image magick”有些问题了 - 当我重新安装真正的老旧的“image magick”时,上面的命令就可以完美地工作了。

编辑,很久以后 - 总有一天我会检查一下“graphics magick”是否已经解决了这个问题。


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