Image Go图像处理

Image Go图像处理,image,go,colors,rgba,Image,Go,Colors,Rgba,我需要加载图像,搜索颜色并替换它们。例如,在图像上,我需要搜索所有红色像素并将其转换为紫色 我正在执行以下操作(img是有效的.png图像): func着色(img image.image){ b:=image.NewRGBA(img.Bounds()) draw.draw(b,b.Bounds(),img,image.ZP,draw.Src) 对于x:=0;x

我需要加载图像,搜索颜色并替换它们。例如,在图像上,我需要搜索所有红色像素并将其转换为紫色

我正在执行以下操作(
img
是有效的
.png
图像):

func着色(img image.image){
b:=image.NewRGBA(img.Bounds())
draw.draw(b,b.Bounds(),img,image.ZP,draw.Src)
对于x:=0;x
事情是,
img.At().RGBA()
似乎没有返回正确的R,G,B,A代码?例如,我得到的数字大于255

那么,我应该如何读取所有图像像素,同时能够知道它们的x和y位置呢。引用其文件:

// RGBA returns the alpha-premultiplied red, green, blue and alpha values
// for the color. Each value ranges within [0, 0xffff], but is represented
// by a uint32 so that multiplying by a blend factor up to 0xffff will not
// overflow.
//
// An alpha-premultiplied color component c has been scaled by alpha (a),
// so has valid values 0 <= c <= a.
转换为
color.RGBA
另一种方法是将颜色转换为结构,其中包含普通和简单的组件:

type RGBA struct {
        R, G, B, A uint8
}
由于您使用的是返回类型为的图像的,因此
image.At()
方法返回的颜色将是动态类型
color.RGBA
,因此您可以简单地使用:

通常(如果图像不是
image.RGBA
)类型,
image.At()
可能是也可能不是具体类型的
color.RGBA

因此,在一般情况下,您需要将颜色转换为
color.RGBA
类型的值。颜色模型之间的转换由建模,并且
image/color
包具有预定义的转换器。您需要的是
color.RGBAModel
color.RGBAModel.Convert()
将返回一个
color.color
值,其动态类型肯定是
color.RGBA

使用
color.RGBAModel
的示例:

var c color.Color
c = color.Gray{160}

rgbacol := color.RGBAModel.Convert(c).(color.RGBA)

fmt.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)
输出(在上尝试):

因此,在您的循环中:

rgbacol := color.RGBAModel.Convert(b.At(x, y).(color.RGBA)
// rgbacol is a struct of type color.RGBA, components are in range 0..255
注意:

上述解决方案仍然会返回alpha预乘组件。如果要撤消alpha预乘法,可以使用
color.NRGBAModel
转换器(而不是
color.RGBAModel

rgbacol := b.At(x, y).(color.RGBA)
log.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)
var c color.Color
c = color.Gray{160}

rgbacol := color.RGBAModel.Convert(c).(color.RGBA)

fmt.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)
160 160 160 255
rgbacol := color.RGBAModel.Convert(b.At(x, y).(color.RGBA)
// rgbacol is a struct of type color.RGBA, components are in range 0..255