在Golang中,當像素值帶有alpha值時,會導致顏色值的變化。而我在Python中也嘗試了同樣的代碼。沒有問題!
這是 Golang 腳本:
newRgba := image.NewRGBA(image. Rect(0, 0, 1, 1) //新的影像。
newRgba.SetRGBA(0, 0, color. RGBA{R: 55, G: 23, B: 14, A: 122}) //set pixel value 設定像素值
f, _ := os.Create("./save.png"/span>)
defer f.Close()
//保存影像
png.Encode(f, newRgba)
ff, _ := ioutil.ReadFile("./save.png") //讀取圖片。
bbb := bytes.NewBuffer(ff)
m, _, _ := image.Decode(bbb)
R, G, B, A := m.At(0, 0).RGBA()
fmt.Println(R>>8,
G>>8。
B>>8,
A>>8,
) //得到 {55 23 13 122} 。,這是不對的! 為什么不是{55 23 14 122}?
這是python腳本:
from PIL import Image
img = 影像。 new('RGBA', (1, 1) 。(55, 23, 14, 122) # 設定像素值
img.save('bg.png')
im = Image.open('bg.png')
pix = im.load()
print(pix[0,0]) // get (55, 23, 14, 122)
為什么在Golang中得到的結果會發生變化?
uj5u.com熱心網友回復:color.RGBA表示一個α-預乘的顏色。對于預倍增的顏色,alpha分量代表了一個R/G/B分量可以采取的最大值。因此,color.RGBA{122,122,122}代表alpha為122的白色。
png.Decode回傳一個image.NRGBA,它沒有被預先乘法。這在顯示像素型別時更清楚。Eg:
fmt.Printf("%#v
"/span>, m.At(0, 0)
//color.NRGBA{R:0xff, G:0xff, B:0xff, A:0x7a}
你的例子在使用NRGBA型別時將會起作用。
請看這個運行的例子。https://play.golang.org/p/69bvYQfkCA_P
Before: color.NRGBA: {55 23 14 122}After: color.NRGBA: {23 14 {122 }
After: color.NRGBA: {55 23 14 122}23 14 122}。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/326127.html
標籤:
