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


293

我有一些具有透明性的PNG图像,我需要创建将图像层组成白色背景的版本。我已经使用Image Magick的“转换”操作尝试了各种操作,但是根本没有任何反应,或者出现了错误。我不想使用中间的JPG表单,因为我不需要这些工件。当然,在Gimp或Photoshop或其他工具中执行此操作很容易,但是我真的很希望从命令行编写脚本,因为其中有很多事情。

一个不起作用的Image Magick命令的示例是:

convert img1.png -background white -flatten img1-white.png

这会导致错误。

谢谢!


在我的特定情况下,通过(Apache)FO处理器创建PDF / A时,PNG中的透明层冲突。PDF / A不允许透明。我使用的技巧是改为使用JPG。
维瓦尼2014年

3
“这会导致错误。” 错误消息是什么?
亚伦·麦克戴德

该命令应该可以正常工作。如果没有,则可能是Imagemagick或libpng的安装错误,或者两者的版本都太旧了。您的Imagemagick和libpng是什么版本?
fmw42

Answers:


253

这对我有用:

convert -flatten img1.png img1-white.png

文档参考:


3
不知何故,这对我不起作用...我尝试使用“-透明色白色”,但出现异常/警告。

1
事实证明,我还需要将-background设置为白色。我还必须下载colors.xml,该文件丢失了。

9
在下面查看我的答案。它是在此之后2年添加的。
Rok Kralj

42
请勿尝试使用转换多页文档-flatten。它将页面平整为一页。
蒂姆·S.

8
如果要对文件夹中的所有文件执行此操作,可以采用以下方法:mogrify -flatten *.png以防万一,请不要忘记进行备份。此处的更多信息:imagemagick.org/script/mogrify.php
troyane

372
-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 2015年

5
@SkippyleGrandGourou:这是必需的,因为PNG的透明后备颜色并不总是白色。
Rok Kralj

3
比接受的答案更好(在超过一层的情况下做不正确的事情)
axkibe

5
生成的图像仍将具有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

46

在ImageMagick中直接展平图像并应用背景图像

但是,命令的顺序非常重要

要在透明图像上应用任何背景并将其展平,请先应用背景,而不是先对其进行展平。反之亦然。

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

无论出于什么原因,这对我来说都很好。不知道为什么您的原始尝试不起作用。
安东尼

23

唯一对我有用的是所有答案的混合:

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

4
太好了 实际上,我需要的颜色不是白色,您可以使用... -background "#010203" ...而不是白色。
亚历克西斯·威尔克

这是替换目录中所有文件夹中相同图像的方法mogrify -background white -flatten */*.png
朱利安

-alpha remove是什么为我做
斯特凡Dragnev

13

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

mogrify -background white -flatten */*.png


10

使用-flatten令我非常生气,因为-flatten结合农作物和调整大小根本不起作用。官方也是我唯一的正确方法是“删除” Alpha通道。

-alpha删除-alpha关闭(JPG不需要)

参见文档:http : //www.imagemagick.org/使用/ masking /#remove


那么如何成为命令?这在这里不起作用:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png
Aquarius Power

我只想删除Alpha。转换为JPG做到了,非常容易。谢谢你的提示。
Roger CS Wernersson 2014年

这是以上对我有用的唯一解决方案。现在,iTunes商店对我的图像感到满意。
Bill Cheswick,2015年

7

ImageMagick使用指南的Alpha删除”部分建议使用该选项,例如:-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用作清除透明度的技术的重要警告:

但是,这不适用于“迁移”或一系列的多个图像,这主要是因为“ -flatten”运算符实际上是旨在将多个图像合并为一个图像。

因此,如果您一次转换多个图像(例如,从PDF文件生成缩略图),-flatten将无法执行您想要的操作(它将所有页面的所有图像拼合为一个图像)。另一方面,使用该-alpha remove技术仍将产生多幅图像,每个图像都去除了透明度。


5

看来您的命令是正确的,所以问题可能是由于缺少对PNG()的支持。您可以检查convert -list configure以下内容或尝试以下操作:

sudo yum install libpng libpng-devel

1
对了谢谢; 此(旧)的问题是在“graphicks magick”的错误,这是一个叉/重写/“难懂的”的一切。
尖尖的

@尖尖我明白了!出于好奇,导致此问题的真正原因是什么(仅在一种版本中)?
Alastair

好吧,我真的不知道。这只是一个错误。我不是Graphicks Magick的维护者,所以我不了解他们的代码。我想在某个时候再试一次。
Pointy

ubuntu没有吗?这是libpng12-0,但仍然无法使用:(
Aquarius Power

我正在使用libpng12-0已安装并正在运行的Ubuntu 13.04 。如果运行此程序,可以看到png吗?convert -list configure | grep \png
Alastair 2014年

5

这并不完全是您问题的答案,但是我在尝试找出如何删除Alpha通道时找到了您的问题,因此我决定在此处添加此答案:

如果要使用imagemagick删除Alpha通道,可以使用以下命令:

mogrify -alpha off ./*.png

3

似乎我决定在“ image magick”上安装“ graphics magick”的决定有些粗糙-当我重新安装真正的老旧“ image magick”时,上述命令可以很好地工作。

编辑,很长一段时间后-这些天之一,我将检查“ graphics magick”是否已解决此问题。


2

我需要:-alpha background和和-flatten-fill

我制作了一个新的PNG,透明背景,中间有一个红点。

convert image.png -background green -alpha off green.png 失败:产生黑色背景图像

convert image.png -background green -alpha background -flatten green.png 产生具有正确绿色背景的图像。

当然,使用我重命名的另一个文件image.png,它无法执行任何操作。对于该文件,我发现透明像素的颜色为“#d5d5d5”,因此我用绿色填充了该颜色:

convert image.png -fill green -opaque "#d5d5d5" green.png 将透明像素替换为正确的绿色。


当前ImageMagick的正确命令是convert image.png -background green -alpha background -alpha off green.pngor convert image.png -background green -alpha background -alpha remove green.pngconvert image.png -background green -flatten green.png
fmw42 '18

1

非命令行选项:在Windows Paint中打开PNG文件,然后单击“保存”。


0

这将创建一个图像,仅将透明的第一个放在第二个之上

composite -gravity center ImgWithTransp.png BackgroundSameSizeOfImg.png ResultImg.png

最初在此帖子上找到了提示


0

要从文件中实际删除Alpha通道,请使用alpha off选项:

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

1
实际上,您提供的链接说:“它实际上并不删除或破坏附加到图像的Alpha通道,它只是关闭了通道对图像的任何影响。” 要真正删除Alpha通道,请参阅我的答案。
Rok Kralj 2015年

0

我看到了确实对我有帮助的这个问题和答案,但是随后我需要对许多文件进行处理,因此,如果您在一个文件夹中有多个图像(PNG图像),并且想要对所有文件都这样做:

find ./ -name "*.png" -exec convert {} -flatten {} \;

-1

它是-alpha关闭,不是-alpha删除!任何图标中都有Alpha通道时,iOS应用商店上传都会失败!

方法如下:将* .png移除-alpha

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.