2017-02-11 137 views
0

我正在用golang从视频游戏控制台读取framebuffer - 缓冲区格式为BRGA(然后我转换为RGBA)。当我将信息传递到Go PNG Encoder时,出来的图像无效。我使用的代码为 - ,其中:PNG编码产生损坏的图像

其中data是RGBA像素的切片 - 0x398000在长度,pitch为5120,width是1270,和height是720)

img := &image.RGBA{ 
    Pix: data, 
    Stride: pitch, 
    Rect: image.Rect(0, 0, width, height), 
} 

os.Remove("./img.png") 
file, _ := os.Create("./img.png") 
defer file.Close() 
filewriter := bufio.NewWriter(file) 
if err := png.Encode(filewriter, img); err != nil { 
    panic(err) 
} 

预期的结果是:xbox

但实际的结果是(只在Windows上或当在Chrome中查看..奇怪):​​

我已经上传了RGBA片的二进制转储,如果有人希望它 - https://1drv.ms/u/s!Ak-aZ3z7Ea8KwvUsqdP5OgWpZqxsGA

+0

我希望原始数据的大小为:1270 * 720 * 4 == 3657600字节。提供的二进制转储文件的大小为3768320(或者您提到的0x398000)。你确定提供的数据实际上只是原始像素值吗? – Omar

+0

转储的长度是Xbox提供的'framebuffersize'。 –

+0

您能否提供更多关于如何获取数据转储的信息?如果它是原始RGBA像素值,您的代码应该可以工作。 – Omar

回答

0

你是不是冲洗缓冲的作家。你应该这样做:

filewriter := bufio.NewWriter(file) 
defer filewriter.Flush() 

此修复程序后,我得到一个有效的图像:

image produced by program

+0

我可能会错过一些东西,但是您发布的图片与我上面发布的图片完全相同,不是吗? –

+0

哦,有趣。在macOS上,他发布的图像看起来完全是空的(就像完全透明的图像)。 –

+0

哦。我也注意到了这样的事情。它在Chrome(任何操作系统)和Windows上呈现良好。但是在macOS,Safari和iPhone上它只是透明的。说到渲染,macOS可能对规格更严格?将更新原始帖子。 –

0

不是一个解决方法,我想发表评论,但尚不能因声誉,而且会添加到Mac OS的差异。

问题的MacOS部分似乎是新的,从最新的10.12.3更新或Safari的某些内容中显示出来。我还没有缩小源代码。但是,是的,Mac系统将如何对图像进行编码/解码有一些新情况,导致图像变得透明或灰暗。在过去的几个星期里,我所处的一个项目也遇到了这个问题,我仍然在调查它发生故障的位置。