为什么选择高朗编码方法使颜色数据出错?

在高浪中,当像素值带有 alpha 值时,会导致颜色值发生变化。我在python中尝试了相同的代码。没关系!


这是高浪脚本:


newRgba := image.NewRGBA(image.Rect(0, 0, 1, 1)) //new image

newRgba.SetRGBA(0, 0, color.RGBA{R: 55, G: 23, B: 14, A: 122}) // set pixel value

f, _ := os.Create("./save.png")

defer f.Close()

// save image

png.Encode(f, newRgba)



ff, _ := ioutil.ReadFile("./save.png") //read image

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,

) // get {55 23 13 122} , it is wrong! Why not {55 23 14 122} ?

这是蟒蛇脚本:


from PIL import Image

img = Image.new('RGBA', (1, 1), (55, 23, 14,122)) # set pixel value

img.save('bg.png')



im = Image.open('bg.png')

pix = im.load()


print(pix[0,0])  // get (55, 23, 14, 122)

为什么在高浪获得的结果会改变?


慕的地8271018
浏览 132回答 1
1回答

慕标5832272

颜色。RGBA 代表一种阿尔法预乘颜色。对于预乘法颜色,alpha 分量表示 R/G/B 分量可以采用的最大值。因此,用阿尔法122表示白色。color.RGBA{122,122,122,122}呜呜呜。解码返回未预乘的 。当显示像素类型时,这一点会更清晰。例如:image.NRGBAfmt.Printf("%#v\n", m.At(0, 0)) // color.NRGBA{R:0xff, G:0xff, B:0xff, A:0x7a}您的示例在使用类型时将起作用。NRGBA请参阅此运行示例:https://play.golang.org/p/69bvYQfkCA_PBefore: color.NRGBA: {55 23 14 122} After:  color.NRGBA: {55 23 14 122}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go