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

Isr*_*ael 110 png imagemagick alpha-transparency

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

我试过这些例子:

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

但没有理想的结果.

我该怎么做?

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

小智 132

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

convert test.png -transparent white transparent.png
Run Code Online (Sandbox Code Playgroud)

这将test.png中的所有白色变为透明.

  • 这对我来说不起作用,直到我意识到JPG不会透明.一旦我切换到PNG,它就完成了我想要的 - 只需将"白色"更改为"rgb($ r,$ g,$ b)". (6认同)
  • 这不仅会将背景转换为透明,而且还会转换为每个白色像素.有没有办法将背景转换为透明? (2认同)
  • @AlejandroLozdziejski - 你如何定义"背景"? (2认同)

小智 74

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

对我有用的是:

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

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

  • 这很好,在透明背景和不透明前景之间有更平滑的边缘.如果你将JPG中的嘈杂图标转换为PNG,并想要添加透明度,你还可以添加一些中值滤波:`mogrify -format png -median 2 -fuzz 5%-transparent white ico _*.jpg` (6认同)
  • +1,这个答案对我有用,而Rijk没有. (2认同)

hac*_*rb9 34

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
Run Code Online (Sandbox Code Playgroud)

说明

这比之前给出的简单答案要长一些,但它提供更好的结果:(1)由于抗锯齿α,质量优越,(2)只有背景被移除而不是单一颜色.("背景"定义为与左上角像素大致相同的颜色,使用图片边缘的填充.)

此外,alpha通道也被半个像素侵蚀以避免光晕.当然,ImageMagick的形态学操作不会(但是?)在亚像素级别工作,所以你可以看到我在侵蚀之前将alpha通道炸成200%.

比较结果

以下是在ImageMagick徽标上运行时,简单方法("-fuzz 2%-transparent white")与我的解决方案的比较 .我将两个透明图像压平成马鞍棕色背景,使差异明显(点击原件).

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

注意向导的胡子在简单的方法中是如何消失的.比较向导的边缘,看看抗锯齿alpha有助于图形平滑地融入背景.

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

mktrans shell脚本

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

bg_removal脚本

顺便说一下,ImageMagick实际上附带了一个名为"bg_removal"的脚本 ,它以与我的解决方案类似的方式使用floodfill.但是,结果不是很好,因为它仍然使用1位alpha.此外,bg_removal脚本运行速度较慢,使用起来有点棘手(它要求您指定两个不同的模糊值).这是bg_removal输出的一个例子.

bg_removal脚本:有胡子,但没有抗锯齿

  • 我需要将绒毛修改为2%,因为图像包含一台白色背景的白色机器。尽管这不是100%完美,但它是我发现的最佳解决方案,因为我不想在gimp中手动进行操作。:) (2认同)
  • **太棒了**解决方案! (2认同)
  • 为我工作。伟大的! (2认同)

Ric*_*ald 27

这对我有用:

convert original.png -fuzz 10% -transparent white transparent.png
Run Code Online (Sandbox Code Playgroud)

其中模糊%越小,越接近真白色或相反,越大%,越白变化越透明

  • 它不能完美工作,因为它无法处理白色和白色背景的图像。就像特朗普的照片一样。 (2认同)

San*_*nda 12

您可以使用此选项使背景透明

convert test.png -background rgba(0,0,0,0) test1.png
Run Code Online (Sandbox Code Playgroud)

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

  • 外壳可能需要的一些引述`()`:`转换更加的icon.png -gravity中心-Background"RGBA(0,0,0,0)" -extent 27x27新更icon.png` (3认同)

Gok*_*N K 5

如果你想控制透明度,你可以使用 rgba。其中 a 是阿尔法。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
Run Code Online (Sandbox Code Playgroud)


fmw*_*w42 5

使用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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • PS我会猜测"fmw"代表Fred M. Weinhaus.如果是这样,问候,Weinhaus博士!对于任何不知道自己是谁的人,他从1970年代开始撰写了一些关于计算机图形学的开创性研究.每个人都应该在http://www.fmwconcepts.com/imagemagick/上查看他惊人的ImageMagick shell脚本. (2认同)
  • @hackerb9:是的,就是我。我们认识吗?如果您愿意,请给我发电子邮件。我的电子邮件地址在您链接的网页上。 (2认同)