单用标准库没法无损地保存一个带色板的PNG了么?

augustheart · 2013-07-10 02:56:02 · 3537 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-07-10 02:56:02 的主题,其中的信息可能已经有所发展或是发生改变。

一时兴起尝试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这一个毫无意义的过程中产生的?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3537 次点击  
加入收藏 微博
2 回复  |  直到 2013-07-17 10:05:23
augustheart
augustheart · #1 · 12年之前

看了一下源代码,色彩转换部分这个预渲染计算简直莫名其貌

// 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
guotie
guotie · #2 · 12年之前

这个问题很严重

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传