gpt4 book ai didi

colors - 理解 Go 标准库中的一些魔法

转载 作者:IT王子 更新时间:2023-10-29 00:36:29 25 4
gpt4 key购买 nike

所以我一直在筛选 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。我错过了什么?我认为这与前阿尔法乘法有关...

 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
}

最佳答案

不,您所看到的实际上是有道理的。

考虑一个单一的(例如红色)值。它指示像素中的红色程度,作为 8 位量,它介于 0 和 255 之间。因此您可以表示该范围内的所有红色值。

如果您只是将其位移 8 位(或乘以 256)以获得 16 位颜色值,您最终会得到 256 的倍数,介于 0 和 255*256 (65280) 之间(含)。

虽然这样可以相对较好地放大红色,但它并没有在整个 16 位范围内正确地分布红色。

例如,8 位范围内的 255 表示最大红色。简单地将其乘以 256 并不能得出 16 位尺度上的最大红色值,即 65535。

通过乘以 256 然后然后加上原始值(有效乘以 257),它在 0..65535 范围内正确分布。

这与将个位数 0..9 放大到范围 0..99 相同。乘以十是一种方法,但更好的方法是乘以十并加上原始值(或乘以十一):

n     n*10     n*10+n
- ---- ------
0 0 0
1 10 11
2 20 22
3 30 33
4 40 44
5 50 55
6 60 66
7 70 77
8 80 88
9 90 99

关于colors - 理解 Go 标准库中的一些魔法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10512021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com