一时兴起尝试go编写一个图形转换的软件,然后发现了这么一个问题,就是Decode一个带RGBA色板的PNG,然后直接Encode,最后是得不到原来一样的图片的。
拼凑了个很简单的测试代码。
func main(){
f,_ := os.Open("sample.png")
defer f.Close()
img,_ := png.Decode(f)
out,_ := os.Create("result.png")
defer out.Close()
png.Encode(out,img)
}
图片就随便用游戏开发中常见的带透明通道的logo或人物头像。
转换的图片用普通图片浏览器看是没有问题的,但是需要对这张图片进行alpha渲染的话问题就凸显出来了,原图片的色板已经被改变了,但是点阵数据并没有变化,麻烦就此产生了。
无色板的RGBA图片倒是没有这种问题。似乎是解码的时候在image/color中先由RGBA 转换成NRGBA,编码的时候再由NRGBA转换成RGBA这一个毫无意义的过程中产生的?
更多评论
看了一下源代码,色彩转换部分这个预渲染计算简直莫名其貌
// Since Color.RGBA returns a alpha-premultiplied color, we should have r <= a && g <= a && b <= a.
r = (r * 0xffff) / a
g = (g * 0xffff) / a
b = (b * 0xffff) / a
#1