使用ImageMagick和命令行提示符设置透明背景


119

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

我尝试了以下示例:

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

但没有令人满意的结果。

我该怎么做?

重要说明:使用convert命令行。


奇怪-我以为相关的命令是,convert original.png -transparent white new.png但是一旦尝试,就无法使其起作用。顺便说一句,您确定您的背景实际上是白色(#FFFFFF),还是几乎是白色(例如#FEFEFE)?
mathematical.coffee

@ mathematical.coffee好吧,我明白了,让我检查是否不是这种情况,我将继续此线程。谢谢。
以色列

@ mathematical.coffee再次,您好,我检查了颜色,这张图片的背景像#FFFFFF,换句话说就是“白色”。:(事实并非如此!
以色列

Answers:


140

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

convert test.png -transparent white transparent.png

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


6
在我意识到JPG无法透明之前,这对我不起作用。一旦我切换到PNG,它就可以实现我想要的功能-只需将“ white”更改为“ rgb($ r,$ g,$ b)”。
罗杰·迪克

2
他妈的!这很棒!
agilob '16

2
这不仅将背景转换为透明,而且将每个白色像素转换为透明。有没有办法将背景仅转换为透明?
Alejandro Lozdziejski '16

2
@AlejandroLozdziejski-您如何定义“背景”?
2013年

1
@AlejandroLozdziejski:好问题。请查看我的解决方案,该解决方案从边缘开始使用泛洪,寻找与左上像素大致相同的颜色。
hackerb9

79

我有同样的问题。在这种情况下,我必须使用ImageMagick从jpg / png图像格式中删除白色背景。

对我有用的是:

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

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


6
在透明背景和不透明前景之间具有更平滑的边缘时,这很好。如果您将JPG中的嘈杂图标转换为PNG,并希望增加透明度,则还可以添加一些中值过滤:mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
Tomasz Gandor 2014年

44

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徽标上运行时,简单方法(“-模糊2%-透明白色”)与我的解决方案的比较 。我已将两个透明图像展平到鞍形棕色背景上,以使差异显而易见(单击原始图片)。

简单地将白色替换为透明并不总是有效 抗锯齿的Alpha通道和泛洪效果更好

请注意,通过简单的方法,向导的胡须是如何消失的。比较向导的边缘,看看抗锯齿Alpha如何帮助图形平滑融合到背景中。

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

mktrans shell脚本

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

bg_removal脚本

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

bg_removal脚本:留胡子,但缺乏抗锯齿


2
我需要将绒毛修改为2%,因为图像包含一台白色背景的白色机器。尽管这不是100%完美,但它是我发现的最佳解决方案,因为我不想手动进行gimp操作。:)
tukusejssirs

1
很棒的解决方案!
0x01h

29

这对我有用:

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

绒毛百分比越小,则接近真实白色;反之,%越大,则允许与白色的差异越大,则变得透明


1
哇!这正是我所需要的!之前:i.imgur.com/2Rd7w1N.png,之后:i.imgur.com/4RTYygo.png
多里安

它无法正常工作,因为它无法处理具有白色和白色背景的图像。像王牌照片。
Sr. PHP程序员团队负责人,

对于白色上的白色,请尝试使用我上面发布的注水解决方案。或使用我的mktransShell脚本:github.com/hackerb9/mktrans
hackerb9

12

您可以使用它使背景透明

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

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


4
外壳可能需要引用以下内容()convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
Jim K.

7

使用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

在此处输入图片说明


真好 我喜欢您的主旨很简洁。这类似于我编写脚本时的中间步骤之一。我之所以反对,是因为(a)它失去了太多的锐利细节,(b)我想使颜色选择显而易见,以便可以轻松更改它,并且(c)我想从所有边缘而不是顶部填充整个颜色-左上角。(也许我现在忘记了其他事情)。
hackerb9

2
PS:我将大胆猜测“ fmw”代表Fred M. Weinhaus。如果是这样,问候,温豪斯博士!对于任何不知道自己是谁的人,他从1970年代开始就计算机图形学进行了一些开创性研究。每个人都应该在fmwconcepts.com/imagemagick上查看一下他对ImageMagick shell脚本的惊人发现
hackerb9

1
@ hackerb9:是的,就是我。我们彼此认识吗?请给我发电子邮件。我的电子邮件地址在您链接的网页上。
fmw42

4

如果要控制透明度,可以使用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

1

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

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.