141

假设您有任何图像(PNG 或 JPG)。此图像具有白色背景,我需要使此背景透明。

我试过这些例子:

  • convert original.png -background none transparent.png
  • convert original.png -background white -flatten -alpha off transparent.png

但没有理想的结果。

我怎样才能做到?

重要提示:使用convert命令行。

4

8 回答 8

152

我在 Ubuntu 12.04 上使用 ImageMagick 6.6.9-7。
对我有用的是以下内容:

convert test.png -transparent white transparent.png

这将 test.png 中的所有白色更改为透明。

于 2012-06-20T08:15:43.673 回答
92

我有同样的问题。其中我必须使用 ImageMagick 从 jpg/png 图像格式中删除白色背景。

对我有用的是:

1)将图像格式转换为png:convert input.jpg input.png

2)convert input.png -fuzz 2% -transparent white output.png

于 2013-05-10T11:19:31.277 回答
60

解决方案

color=$( convert filename.png -format "%[pixel:p{0,0}]" info:- )
convert filename.png -alpha off -bordercolor $color -border 1 \
    \( +clone -fuzz 30% -fill none -floodfill +0+0 $color \
       -alpha extract -geometry 200% -blur 0x0.5 \
       -morphology erode square:1 -geometry 50% \) \
    -compose CopyOpacity -composite -shave 1 outputfilename.png

解释

这比之前给出的简单答案要长一点,但它给出更好的结果:(1)由于抗锯齿 alpha,质量更好,(2)去除背景而不是单一颜色。(“背景”被定义为与左上角像素大致相同的颜色,使用图片边缘的填充。)

此外,Alpha 通道也被侵蚀了半个像素,以避免出现光晕。当然,ImageMagick 的形态学操作(还没有?)在亚像素级别起作用,所以你可以看到我在腐蚀之前将 alpha 通道放大到 200%。

结果比较

这是在ImageMagick logo上运行时简单方法(“-fuzz 2% -transparent white”)与我的解决方案的比较 。我已将两个透明图像展平到马鞍棕色背景上,以使差异明显(点击查看原件)。

将白色简单替换为透明并不总是有效 抗锯齿的 alphachannel 和填充看起来好多了

注意巫师的胡须在简单的方法中是如何消失的。比较向导的边缘,了解抗锯齿 alpha 如何帮助图形平滑地融入背景。

当然,我完全承认有时您可能希望使用更简单的解决方案。(例如:它更容易记住,如果你要转换为 GIF,无论如何你都被限制为 1 位 alpha。)

mktrans 外壳脚本

由于您不太可能想要重复输入此命令,因此我建议将其包装在脚本中。您可以从 github 下载执行我建议的解决方案的 BASH shell 脚本。它可以在一个目录中的多个文件上运行,并包含有用的注释,以防你想调整一些东西。

bg_removal 脚本

顺便说一句,ImageMagick 实际上带有一个名为 “bg_removal”的脚本 ,它以与我的解决方案类似的方式使用洪水填充。但是,结果并不好,因为它仍然使用 1 位 alpha。此外,bg_removal 脚本运行速度较慢并且使用起来有点棘手(它需要您指定两个不同的模糊值)。这是 bg_removal 的输出示例。

bg_removal 脚本:有胡须,但缺乏抗锯齿

于 2017-06-14T10:57:33.127 回答
33

这对我有用:

convert original.png -fuzz 10% -transparent white transparent.png

其中 fuzz % 越小,越接近真正的白色,反之,% 越大,允许的白色变化越多,变得透明

于 2014-07-01T13:07:37.897 回答
14

您可以使用它使背景透明

convert test.png -background rgba(0,0,0,0) test1.png

以上给出了完美的透明背景

于 2014-01-29T07:09:36.913 回答
10

使用 ImageMagick,这与hackerb9 代码和结果非常相似,但命令行更简单一些。它确实假设左上角的像素是背景颜色。我只是用透明度填充背景,然后选择 alpha 通道并对其进行模糊处理,并使用 -level 50x100% 删除一半的模糊区域。然后重新打开所有通道并将其压平为棕色。-blur 0x1 -level 50x100% 用于消除 Alpha 通道透明度边界的锯齿。您可以调整模糊值、模糊量和-level 50% 值来改变抗锯齿的程度。

convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg

在此处输入图像描述

于 2017-06-14T16:42:33.183 回答
5

如果要控制透明度级别,可以使用 rgba。其中 a 是 alpha。0 表示透明,1 表示不透明。确保最终输出文件必须具有 .png 扩展名以提高透明度。

convert 
  test.png 
    -channel rgba 
    -matte 
    -fuzz 40% 
    -fill "rgba(255,255,255,0.5)" 
    -opaque "rgb(255,255,255)" 
       semi_transparent.png
于 2015-01-23T19:52:19.900 回答
1

是的。也有同样的问题。这是我运行的命令,它运行良好: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico

于 2015-10-14T20:36:56.273 回答