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

时间:2019-01-11 03:41:19

标签: image go transparent

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

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

2 个答案:

答案 0 :(得分:0)

通常这是不可能的,但是可以尝试使用启发式方法。

为什么不可能?

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

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

启发式方法

如果您对原始图像有所了解,或者可以通过查看图像来推断某些内容,则可以推断出原始像素的颜色和透明度。一个简单的第一步是,如果外部像素为白色,则可能要用完全透明的像素填充该区域。此外,彩色区域 中的白色区域可能是也可以透明的孔。

接下来,您可以推断出单色对象周围的边框像素的颜色(假定使用透明性进行抗锯齿)。例如,对于一个圆周上有粉红色像素的红色圆圈,很可能它们最初是红色的,并具有一定的透明度,导致它们以不同的粉红色阴影进行渲染。对于更复杂的多色形状,您可以通过使用判断力,原始图像的知识/手法以及有关如何执行抗锯齿的知识手动编辑图像来获得合理的结果。

很多年前,我写了一个Paint.Net插件(C#)使这种事情自动化,有时它给出了合理的结果,但是通常您需要手工完成。

答案 1 :(得分:0)

“图像”包具有解码功能

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

image.Image是界面

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()获取高度和宽度,并从At(x,y)获得颜色。

所以,这是下一步:

  • 使用alpha通道制作另一张图片
  • 反复将整个图像一个像素扔一个像素,
  • 检查颜色,执行所需操作后将颜色复制到新图像中。