【发布时间】:2012-05-09 07:56:09
【问题描述】:
所以我一直在筛选 Go 标准库中的一些代码,试图理解它们的图像和颜色包,但发现了一些我无法理解的代码。 来自http://golang.org/src/pkg/image/color/color.go?s=794:834#L14
据我了解,它应该将 8 位预 alpha 乘法 RGB 值转换为 16 位值,保存在 32 位变量中,以防止它们在图像算法中相乘时溢出。
我无法理解的是像r |= r << 8 这样的行,据我了解,这相当于r = r*2^8+r,因为r << 8 在右侧插入零,它们与旧的r 进行或运算。
对于 r=255 的输入,它的计算结果为 65535=2^16 - 1,这与预期的一样,但对于中间的值没有意义,它们并没有真正映射到成比例的东西更大的范围。 例如,127 get 映射到 32639,而我希望 32767 代表 127。 我错过了什么?我认为这与pre-alpha-multiplication有关......
func (c RGBA) RGBA() (r, g, b, a uint32) {
r = uint32(c.R)
r |= r << 8
g = uint32(c.G)
g |= g << 8
b = uint32(c.B)
b |= b << 8
a = uint32(c.A)
a |= a << 8
return
}
【问题讨论】:
标签: colors go bit-manipulation bitmapdata rgba