2017-04-26 126 views
1

我想保存我的渲染輸出到文件。我已經使用FreeImage作爲依賴項,所以我想繼續使用它。我使用glReadPixels來讀取緩衝區中的RGB值。這些值作爲GLubytes輸入緩衝區,所以我想我需要像這樣讀取它們。但是,當我運行以下代碼片段時,FreeImage_ConvertFromRawBits調用seg故障,我不明白爲什麼。我諮詢了the docs,看來我正在做的一切都正確。有其他人遇到這個問題嗎?OpenGL的glReadPixels FreeImage位圖

GLubyte pixels[3*_winWidth*_winHeight]; 
glReadPixels(0, 0, _winWidth, _winHeight, GL_RGB, GL_UNSIGNED_BYTE, pixels); 
FIBITMAP *bitmap = FreeImage_ConvertFromRawBits(pixels, _winWidth, 
    _winHeight, 3 *_winWidth, 24, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, 
    FI_RGBA_BLUE_MASK, false); 
+0

@genpfault:我之前和同一個問題,雖然你是對的,它肯定應該被切換回 – marcman

+0

是啊,[這裏你去](http://stackoverflow.com/a/17371181/44729),感覺免費使用它來建立。 – genpfault

+0

我會放棄它,謝謝! – marcman

回答

1

我在發佈它後看到了這個問題。如果我記得沒錯,我認爲你說你的片段與你實際使用的片段相比簡化了。

因此,最好的猜測是你沒有爲pixels分配足夠的內存。

下面是截取屏幕截圖並使用FreeImage進行保存的更完整示例。

BYTE *pixels = (BYTE*)malloc(width * height * 3); 

glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, pixels); 

FIBITMAP *image = FreeImage_ConvertFromRawBits(pixels, width, height, 3 * width, 24, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, FALSE); 

if (FreeImage_Save(FIF_BMP, image, "screenshot.bmp", 0)) 
    printf("Successfully saved!\n"); 
else 
    printf("Failed saving!\n"); 

FreeImage_Unload(image); 

free(pixels); 

在這裏您可以看到OpenGL和照片查看器顯示相同。

最後,我想起了一些關於彩色掩膜板是多餘的。我看了一下,發現這個線程從2005年。

目前,顏色蒙版只用於16位RGB圖像,這就是爲什麼你的代碼產生兩個相同的圖像。

FreeImage Thread, 2005

這是當然的舊線,所以把它當作一粒鹽。然而,我卻無法找到任何新的提及。當我測試它時,更改FreeImage_ConvertFromRawBits()的掩碼不起作用。

相關問題