2017-02-11 133 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系統將如何對圖像進行編碼/解碼有一些新情況,導致圖像變得透明或灰暗。在過去的幾個星期裏,我所處的一個項目也遇到了這個問題,我仍然在調查它發生故障的位置。