私はGo標準ライブラリの画像と色のパッケージを理解しようとしていますが、いくつかのコードを見つけようとしています。 。 http://golang.org/src/pkg/image/color/color.go?s=794:834#L14Go標準ライブラリのいくつかのビットマジックの意味を作る
私の理解では、8ビットのアルファ乗算RGB値を16ビットのものに変換し、32ビット変数に保存して、画像の関節炎を乗り越える際にオーバーフローするのを防ぐ必要があります。私はr << 8
右にゼロを挿入し、それらが古いR OR操作を取得するので、これはr = r*2^8+r
と同等であることを理解として私が意味することはできませんどのような
はr |= r << 8
のような線です。
r = 255の入力に対しては、これは期待どおりの65535 = 2^16-1と評価されますが、中間の値は実際には何かに比例してマッピングされませんより広い範囲で。 たとえば、127のgetは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
}
私はそれだけシフトし、その後、より良いのですが、それはまだ間違っていないことを理解できますか? 例えば、小数点の場合、5 getは55にマップされるので、真ん中にあるという性質を失います。 –
@NiklasSchnelle、トップ値が10(または9.9999 ...)であると考えると、5は真ん中にあります。実際には、トップ値は9なので、4.5が「中間」値になります。したがって、5が存在する「位置」は5/9であり、0.99の範囲(55/99)に55が存在するのとまったく同じ場所です。あなたの問題は、バイト範囲が '[0,256]'(ゼロを含み256を除いて、255.99までを意味する)だと考えているようです。実際は '[0,255]'です。両端)。 – paxdiablo
つまり、「中間」は上限と下限の( '0 + 9)/ 2 = 4.5'の平均です。 4.5倍の11倍にすると49.5倍になります。これは '(0 + 99)/ 2 = 49.5'という2桁の範囲で同じプロパティを持ちます。 – paxdiablo