1 回答

TA貢獻1810條經驗 獲得超4個贊
img.At().RGBA()是Color.RGBA()。引用其文檔:
// 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()在 range 0..0xffff, not 0..0xff,并且它們也是 alpha 預乘的。
手動解碼
取回該0..255范圍內的紅色、綠色、藍色分量的一種方法是右移 8,例如:
r, g, b, a := b.At(x, y).RGBA()
r, g, b, a = r>>8, g>>8, b>>8, a>>8
log.Println(r, g, b) // Now in range 0..255
轉換為 color.RGBA
另一種方法是將顏色轉換color.RGBA為結構,其中包含簡單明了的組件:
type RGBA struct {
R, G, B, A uint8
}
由于您使用image.NewRGBA()which 返回類型的圖像image.RGBA,因此該方法返回的顏色Image.At()將是動態類型color.RGBA,因此您可以簡單地使用類型斷言:
rgbacol := b.At(x, y).(color.RGBA)
log.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)
一般來說(如果 image 不是 type image.RGBA),Image.At()可能是也可能不是具體 type color.RGBA。
因此,在一般情況下,您需要將顏色轉換為 type 的值color.RGBA。顏色模型之間的轉換由 建模color.Model,并且image/color包具有預定義的轉換器。你需要的是color.RGBAModel. color.RGBAModel.Convert()將返回一個color.Color動態類型肯定是的值color.RGBA。
使用示例color.RGBAModel:
var c color.Color
c = color.Gray{160}
rgbacol := color.RGBAModel.Convert(c).(color.RGBA)
fmt.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)
輸出(在Go Playground上試試):
160 160 160 255
所以在你的循環中做:
rgbacol := color.RGBAModel.Convert(b.At(x, y).(color.RGBA)
// rgbacol is a struct of type color.RGBA, components are in range 0..255
筆記:
上述解決方案仍會為您返回 alpha 預乘分量。如果要撤消 alpha 預乘,可以使用color.NRGBAModel轉換器(而不是color.RGBAModel)。
- 1 回答
- 0 關注
- 168 瀏覽
添加回答
舉報