第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么golang RGBA.RGBA() 方法使用| 和<<?

為什么golang RGBA.RGBA() 方法使用| 和<<?

Go
慕田峪9158850 2021-12-13 17:13:33
在 golang 顏色包中,有一種方法可以從RGBA對(duì)象中獲取 r,g,b,a 值: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}如果我要實(shí)現(xiàn)這個(gè)簡(jiǎn)單的功能,我會(huì)寫這個(gè)func (c RGBA) RGBA() (r, g, b, a uint32) {    r = uint32(c.R)    g = uint32(c.G)    b = uint32(c.B)    a = uint32(c.A)    return}r |= r << 8使用的原因是什么?
查看完整描述

3 回答

?
人到中年有點(diǎn)甜

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊

來(lái)自優(yōu)秀的“ The Go image package ”博文:


[...] 通道具有 16 位有效范圍:100% 紅色由 RGBA 表示,返回 r 為 65535,而不是 255,因此從 CMYK 或 YCbCr 轉(zhuǎn)換不會(huì)有損。第三,返回的類型是uint32,盡管最大值是65535,以保證兩個(gè)值相乘不會(huì)溢出。



請(qǐng)注意,RGBA 的 R 字段是范圍 [0, 255] 中的 8 位 alpha 預(yù)乘顏色。RGBA 通過(guò)將該值乘以 0x101 以生成范圍 [0, 65535] 內(nèi)的 16 位 alpha 預(yù)乘顏色來(lái)滿足 Color 接口


因此,如果我們查看帶有值的顏色的位表示,c.R = 10101010則此操作


r = uint32(c.R)

r |= r << 8

有效地將第一個(gè)字節(jié)復(fù)制到第二個(gè)字節(jié)。


   00000000000000000000000010101010 (r)

 | 00000000000000001010101000000000 (r << 8)

--------------------------------------

   00000000000000001010101010101010 (r |= r << 8)

這等效于乘以因子0x101并將所有 256 個(gè)可能值均勻分布在 [0, 65535] 范圍內(nèi)。


查看完整回答
反對(duì) 回復(fù) 2021-12-13
?
叮當(dāng)貓咪

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊

的color.RGBA類型實(shí)現(xiàn)了RGBA滿足方法color.Color接口:


type Color interface {

    // RGBA returns the alpha-premultiplied red, green, blue and alpha values

    // for the color. Each value ranges within [0, 0xffff], but is represented

    // by a uint32 so that multiplying by a blend factor up to 0xffff will not

    // overflow.

    //

    // An alpha-premultiplied color component c has been scaled by alpha (a),

    // so has valid values 0 <= c <= a.

    RGBA() (r, g, b, a uint32)

}

現(xiàn)在 RGBA 類型用類型表示顏色通道,uint8范圍為 [0, 0xff]。簡(jiǎn)單地將這些值轉(zhuǎn)換為uint32不會(huì)將范圍擴(kuò)展到 [0, 0xffff]。


適當(dāng)?shù)霓D(zhuǎn)換類似于:


r = uint32((float64(c.R) / 0xff) * 0xffff)

然而,他們想避免浮點(diǎn)運(yùn)算。幸運(yùn)的0xffff / 0xff是0x0101,我們可以簡(jiǎn)化表達(dá)式(暫時(shí)忽略類型轉(zhuǎn)換):


r = c.R * 0x0101

  = c.R * 0x0100 + c.R

  = (c.R << 8) + c.R    # multiply by power of 2 is equivalent to shift

  = (c.R << 8) | c.R    # equivalent, since bottom 8 bits of first operand are 0

這基本上就是標(biāo)準(zhǔn)庫(kù)中的代碼所做的。


查看完整回答
反對(duì) 回復(fù) 2021-12-13
?
九州編程

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊

將 0 到 255(8 位 RGB 分量)范圍內(nèi)的值轉(zhuǎn)換為 0 到 65535(16 位 RGB 分量)范圍內(nèi)的值將通過(guò)將 8 位值乘以 65535/255 來(lái)完成;65535/255 正好是 257,也就是十六進(jìn)制 101,因此將一個(gè)字節(jié)乘以 65535/255 可以通過(guò)將該字節(jié)值左移 8 位并將其與原始值進(jìn)行 OR 運(yùn)算來(lái)完成。



查看完整回答
反對(duì) 回復(fù) 2021-12-13
  • 3 回答
  • 0 關(guān)注
  • 628 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)