img.At().RGBA()
是 Color.RGBA()
。引用其文档:
RGBA()
返回的组件范围是
0..0xffff
,而不是
0..0xff
,它们还进行了alpha预乘处理。
手动解码
获取0..255
范围内的红色、绿色和蓝色组件的一种方法是向右移8位,例如:
r, g, b, a := b.At(x, y).RGBA()
r, g, b, a = r>>8, g>>8, b>>8, a>>8
log.Println(r, g, b) // Now in range 0..255
转换为color.RGBA
另一种方法是将颜色转换为color.RGBA
,它是一个包含简单组件的结构体:
type RGBA struct {
R, G, B, A uint8
}
由于您正在使用image.NewRGBA()
,它返回类型为image.RGBA
的图像,因此Image.At()
方法返回的颜色将是动态类型color.RGBA
,所以您可以简单地使用类型断言:
rgbacol := b.At(x, y).(color.RGBA)
log.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)
一般情况下(如果图像不是
image.RGBA
类型),
Image.At()
可能会或可能不会是具体类型
color.RGBA
。因此,在一般情况下,您需要将颜色转换为
color.RGBA
类型的值。颜色模型之间的转换由
color.Model
建模,而
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)
输出结果(在Go Playground上试一试):
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
注意:
以上解决方案仍会返回alpha预乘组件。如果您想撤消alpha预乘,可以使用color.NRGBAModel
转换器(而不是color.RGBAModel
)。