ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我试过这些例子:

转换 original.png -背景无透明.png

转换 original.png -background white -flatten -alpha off transparent.png

但没有理想的结果。

我怎样才能做到?

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

奇怪——我认为相关的命令是 convert original.png -transparent white new.png 但在尝试后,无法让它工作。顺便说一句,您确定您的背景实际上是白色的(#FFFFFF),还是几乎是白色的(例如#FEFEFE)?
@mathematical.coffee 好的,我明白了,让我检查一下是否不是这种情况,我会继续这个线程。谢谢你。
@mathematical.coffee 再次嗨,我检查了颜色,这张图片的背景类似于#FFFFFF,换句话说就是“白色”。 :( 不是这种情况!

A
Aliaksandr Belik

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

convert test.png -transparent white transparent.png

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


在我意识到 JPG 不会透明之前,这对我不起作用。一旦我切换到PNG,它就完全符合我的要求——只需将“white”更改为“rgb($r,$g,$b)”。
这不仅会将背景转换为透明,而且会将每个白色像素都转换为透明。有没有办法只将背景转换为透明?
@AlejandroLozdziejski - 你如何定义“背景”?
@AlejandroLozdziejski:好问题。请参阅我的解决方案,该解决方案使用边缘填充,寻找与左上角像素大致相同的颜色。
也可以使用十六进制颜色代码来获得相同的结果:convert test.png -transparent "#ffffff" transparent.png
J
James Skemp

我有同样的问题。其中我必须使用 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
添加 -alpha off 对我来说是关键
h
hackerb9

解决方案

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”)与我的解决方案的比较。我已将两个透明图像展平到马鞍棕色背景上,以使差异明显(点击查看原件)。

https://i.imgur.com/V0JNRKN.png

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

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

mktrans 外壳脚本

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

bg_removal 脚本

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

https://i.imgur.com/BYb8rxR.png


我需要将 fuzz 修改为 2 %,因为图像包含白色背景的白色机器。尽管这不是 100 % 完美,但它是我发现的最佳解决方案,因为我不想在 gimp 或其他任何地方手动执行此操作。 :)
很棒的解决方案!
为我工作。伟大的!
很棒的解决方案!真的经过深思熟虑和组成。谢谢欧普
R
Ricibald

这对我有用:

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

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


哇!这正是我所需要的!之前:i.imgur.com/2Rd7w1N.png,之后:i.imgur.com/4RTYygo.png
它不能完美地工作,因为它无法处理白色和白色背景的图像。像特朗普的照片。
对于白底白字,请尝试使用 flood fill solution I posted above。或者使用我的 mktrans shell 脚本:github.com/hackerb9/mktrans
S
Sanat Kumar Panda

您可以使用它使背景透明

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

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


shell 可能需要对 () 进行一些引用:convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
这是最好的 + 处理源图像可能有白色区域(或您在 -transparent SOMECOLOR 中使用的任何颜色的情况)
f
fmw42

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

https://i.stack.imgur.com/HN4BU.jpg


好的。我喜欢你用简洁的线条表达了它的要点。这类似于我编写脚本时的中间步骤之一。我决定反对它,因为(a)它丢失了太多锐利的细节,(b)我想让颜色选择明显以便可以轻松更改,以及(c)我想从所有边缘填充,而不仅仅是顶部-左角。 (我现在可能忘记了其他事情)。
PS 我会大胆猜测“fmw”代表 Fred M. Weinhaus。如果是这样,问候,Weinhaus 博士!对于任何不知道他是谁的人来说,他从 1970 年代开始写了一些计算机图形学的开创性研究。每个人都应该在 fmwconcepts.com/imagemagick 上查看他惊人的 ImageMagick shell 脚本。
@hackerb9:是的,就是我。我们认识吗?如果您愿意,请给我发送电子邮件。我的电子邮件地址在您链接的我的网页上。
G
Gokul N K

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

s
stacigh

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


在我的情况下它不起作用 - 我正在使用拼接。您的解决方案只是像大多数答案一样添加白色区域。