поэтому я просматривал некоторый код в стандартной библиотеке Go, пытаясь разобраться в их пакетах изображений и цветов, но нашел код, в котором я просто не могу разобраться. с http://golang.org/src/pkg/image/color/color.go?s=794:834#L14
Насколько я понимаю, он должен преобразовывать 8-битные предварительно альфа-умноженные значения RGB в 16-битные, сохраненные в 32-битных переменных, чтобы предотвратить их переполнение при умножении в графическом изображении.
Что я не могу понять, так это строки типа r |= r << 8
, насколько я понимаю, это эквивалентно r = r*2^8+r
, потому что r << 8
вставляет нули справа, и они получаются или объединяются со старым r.
Для ввода r = 255 это оценивается как 65535 = 2 ^ 16 - 1, что соответствует ожидаемому, но это не имеет смысла для значений в середине, которые на самом деле не сопоставляются с чем-то пропорциональным в большем диапазоне . Например, 127 сопоставляется с 32639, в то время как я ожидаю, что 32767 будет представлять 127. Что мне не хватает? Я думаю, что это как-то связано с пре-альфа-умножением...
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
}