如何在golang中将白色背景更改为透明


如何将Golangimage.Image的白色背景更改为透明?

我想把白色背景变成半透明的颜色,你有什么建议吗?

这在一般情况下是不可能的,但有一些启发式方法可以尝试。

为什么不可能?

如果原始图像具有一些透明像素,并且在纯白色背景(或任何已知背景)上渲染,则在生成的图像中会丢失信息。例如,粉红色像素是由具有一定透明度的红色像素创建的,还是由没有透明度的真正粉红色像素创建的?

即使是纯白像素最初也可能是全白的,或者是完全透明的,或者介于两者之间。

启发式方法

如果你对原始图像有所了解,或者通过观察它可以推断出一些东西,你就可以推断出原始像素的颜色和透明度。一个简单的第一步是,如果外部像素是白色的,那么你可能想用完全透明的像素来填充这个区域。彩色区域内的白色区域也可能是透明的孔。

接下来,您可以推断单个颜色的对象周围的边界像素的颜色(假设透明度用于消除混叠)。例如,对于一个圆周上有粉色像素的红色圆圈,它们很可能最初是红色的,但有一些透明度,导致它们呈现为不同色调的粉红色。对于更复杂的多色形状,您可以通过使用原始图像的判断、知识/猜测以及如何执行抗锯齿的知识手动编辑图像来获得合理的结果。

我写了一幅画。Net插件(C#)在很多年前就实现了这类事情的自动化,有时它会给出合理的结果,但通常你需要手动完成。

包"image"具有解码功能

func Decode(r io.Reader) (Image, string, error)

图像。图像是接口

type Image interface {
// ColorModel returns the Image's color model.
ColorModel() color.Model
// Bounds returns the domain for which At can return non-zero color.
// The bounds do not necessarily contain the point (0, 0).
Bounds() Rectangle
// At returns the color of the pixel at (x, y).
// At(Bounds().Min.X, Bounds().Min.Y) returns the upper-left pixel of the grid.
// At(Bounds().Max.X-1, Bounds().Max.Y-1) returns the lower-right one.
At(x, y int) color.Color
}

在您将文件解码为图像之后。在图像中,可以从Bounds()获得Height和Width,从At(x,y)获得color。

所以,下一步该怎么做:

  • 使用alpha通道制作另一个图像
  • 一个像素一个像素地迭代抛出整个图像
  • 检查颜色,在你做任何你想做的事情后将颜色复制到新的图像中

最新更新