1 回答

TA贡献1810条经验 获得超4个赞
img.At().RGBA()是Color.RGBA()。引用其文档:
// 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.
由返回的分量RGBA()在 range 0..0xffff, not 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()which 返回类型的图像image.RGBA,因此该方法返回的颜色Image.At()将是动态类型color.RGBA,因此您可以简单地使用类型断言:
rgbacol := b.At(x, y).(color.RGBA)
log.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)
一般来说(如果 image 不是 type image.RGBA),Image.At()可能是也可能不是具体 type color.RGBA。
因此,在一般情况下,您需要将颜色转换为 type 的值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)。
- 1 回答
- 0 关注
- 156 浏览
添加回答
举报