そのため、Go標準ライブラリのコードをふるいにかけて、イメージとカラーパッケージを理解しようとしましたが、理解できないコードがいくつか見つかりました。http://golang.org/src/pkg/image/color/color.go?s=794:834#L14から
私の理解では、8ビットの事前にアルファ乗算されたRGB値を16ビットの値に変換し、32ビット変数に保存して、画像のアーティメティックで乗算するときにオーバーフローしないようにする必要があります。
私が理解できないのは、r |= r << 8
私が理解しているような行です。これは、 が右側にゼロを挿入し、古い r と or'ed を取得するためですr = r*2^8+r
。r << 8
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
}