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

Posted

技术标签:

【中文标题】用白色背景替换PNG图像中的透明度【英文标题】:Replace transparency in PNG images with white background 【发布时间】:2010-02-24 00:04:34 【问题描述】:

我有一些透明的 PNG 图像,我需要创建将图像层组合到白色背景上的版本。我用 Image Magick“转换”操作尝试了各种方法,但要么什么都没有发生,要么我得到一个错误。我不想使用中间 JPG 表格,因为我不想要这些工件。当然,在 Gimp 或 Photoshop 或其他任何东西中很容易做到这一点,但我真的更愿意从命令行编写脚本,因为有很多这样的东西。

一个不工作的 Image Magick 命令的例子是:

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

这会导致错误。

谢谢!

【问题讨论】:

在我的具体情况下,PNG 中的透明层在通过 (Apache) FO 处理器创建 PDF/A 时发生冲突。 PDF/A 不允许透明度。我使用的 hack 是转为 JPG。 “这会导致错误。”错误信息是什么? 该命令应该可以正常工作。如果没有,那么您可能安装了错误的 Imagemagick 或 libpng,或者您的版本太旧。你的 Imagemagick 和 libpng 是什么版本的? 【参考方案1】:
-background white -alpha remove -alpha off

示例:

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

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

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

【讨论】:

似乎不需要-background white(不过可能是其他颜色)。 @SkippyleGrandGourou:这是必需的,因为 PNG 的透明度后备颜色并不总是白色。 比公认的答案更好(如果不止一层,则不会做正确的事情) 生成的图像仍将具有 Alpha 通道。它会是空的,但它仍然会在那里。要完全删除频道,请添加-alpha off 不起作用。我制作了一个新的PNG,背景透明,中间有一个红点。无论我指定什么颜色,总是产生黑色背景。 convert image.png -background white -alpha off white.png 生成了一个黑色背景的图像。 convert image.png -background "#00ff33" -alpha off 00ff33.png 产生了黑色背景【参考方案2】:

这对我有用:

convert -flatten img1.png img1-white.png

文档参考:

-flatten command-line option -layers command-line option(-flatten 等价于-layers flatten

【讨论】:

不知何故这对我不起作用...我尝试了“-transparent-color white”,但收到异常/警告。 事实证明,我还需要将 -background 设置为白色。我还必须下载丢失的 colors.xml。 在下面查看我的答案。它是在此之后 2 年添加的。 不要尝试使用-flatten 转换多页文档。它会将页面拼合为一页。 如果您想对文件夹中的所有文件执行此操作,您可以这样做:mogrify -flatten *.png 以防万一,不要忘记进行备份。更多信息在这里:imagemagick.org/script/mogrify.php【参考方案3】:

在 ImageMagick 中扁平化图像和应用背景图像是直接的

但是,命令的顺序很重要

要在透明图像上应用任何背景并将其展平,请先应用背景而不是展平它。反过来不行。

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

【讨论】:

无论出于何种原因,这对我来说都很好。不知道为什么您最初的尝试没有奏效。【参考方案4】:

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

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

【讨论】:

酷,这行得通。我实际上需要白色以外的其他颜色,您可以使用... -background "#010203" ... 而不是使用白色。 这里是如何替换目录mogrify -background white -flatten */*.png的所有文件夹中的相同图像 -alpha remove 为我做了什么【参考方案5】:

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

mogrify -background white -flatten */*.png

【讨论】:

【参考方案6】:

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

-alpha remove -alpha off(JPG 不需要)

查看文档:http://www.imagemagick.org/Usage/masking/#remove

【讨论】:

那么怎么会变成命令呢?这在这里不起作用:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png 我只想删除 alpha。转换为JPG就可以了,又好又简单。感谢您的提示。 这是上述唯一对我有用的解决方案。现在 iTunes 商店对我的形象很满意。【参考方案7】:

ImageMagick Usage Guide 的Alpha Remove 部分建议使用-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

在Removing Transparency from Images 部分中描述了其他常用的去除透明度技术的更多详细信息。

该部分提到了使用-flatten 作为消除透明度的技术的重要警告:

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

因此,如果您同时转换多个图像,例如从 PDF 文件生成缩略图,-flatten 不会做你想做的事(它会将所有页面的所有图像拼合为一张图像)。另一方面,使用-alpha remove 技术仍会生成多张图片,每张图片都已移除透明度。

【讨论】:

【参考方案8】:

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

sudo yum install libpng libpng-devel

【讨论】:

好的,谢谢;这个(旧)问题是“graphicks magick”中的一个错误,它是“image magick”的一个分叉/重写/任何东西。 @Pointy 我明白了!出于好奇,问题的真正原因是什么(仅在一个版本中)? 嗯,我真的不太清楚;这只是一个错误。我不是 Graphicks Magick 的维护者,所以我对他们的代码一无所知。我想我需要在某个时候再试一次。 ubuntu 没有?这是 libpng12-0 但仍然无法正常工作:( 我正在使用 Ubuntu 13.04 并安装了 libpng12-0 并正常工作。如果你运行它,你能看到 png 吗? convert -list configure | grep \png【参考方案9】:

这不完全是您问题的答案,但我在试图弄清楚如何删除 alpha 通道时发现了您的问题,因此我决定在此处添加此答案:

如果你想使用 imagemagick 移除 alpha 通道,你可以使用这个命令:

mogrify -alpha off ./*.png

【讨论】:

【参考方案10】:

看起来我决定在“image magick”上安装“graphics magick”有一些粗糙的边缘 - 当我重新安装真正的粗陋的旧“image magick”时,上面的命令效果很好。

编辑,很长一段时间后 — 这些天我会检查“图形魔术师”是否解决了这个问题。

【讨论】:

【参考方案11】:

我需要:-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.pngconvert image.png -background green -alpha background -alpha remove green.pngconvert image.png -background green -flatten green.png【参考方案12】:

我看到这个问题和答案确实对我有帮助,但后来我需要为很多文件执行此操作,因此,如果您在一个文件夹中有多个图像(PNG 图像)并且您想为所有文件执行此操作:

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

【讨论】:

【参考方案13】:

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

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

最初在this post上找到提示

【讨论】:

【参考方案14】:

要真正从文件中删除 alpha 通道,请使用 alpha off 选项:

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

【讨论】:

实际上,您提供的链接说:“它实际上并没有删除或破坏附加到图像的 alpha 通道,它只是关闭了通道对图像的任何影响。”要真正删除 alpha 通道,请参阅我的答案。【参考方案15】:

这是 -alpha 关闭,而不是 -alpha 删除!当任何图标中有 alpha 通道时,ios 应用商店上传失败!!

操作方法如下: mogrify -alpha off *.png

【讨论】:

【参考方案16】:

这对我有用:

magick convert OLD.png -background white -alpha remove NEW.png

这是一张带有透明背景的初始图片,以防有助于测试:

此外,对于 PC 上的一次性,您始终可以在 Windows Paint 中打开 PNG 文件并单击保存。这会自动将透明度变为不透明的白色。

【讨论】:

以上是关于用白色背景替换PNG图像中的透明度的主要内容,如果未能解决你的问题,请参考以下文章

png 透明图像元数据带有白色背景

显示白色背景的对话,当使用与透明度的png作为背景时

如何在 iOS 中为透明的 png 图像着色?

css在灰色透明的背景下,如何才能使上面的字的颜色为白色?

用背景颜色填充 png 透明度

怎么制作透明图片,