2013-05-14 49 views
0

我正在將OpenGL FBO內容寫入TGA文件。我以BGR格式讀取像素並保存爲未壓縮的TGA。奇怪的是,如果我保存單調顏色(無紋理),我的導出器寫入ok但如果像素數據來自紋理,如下圖中描繪我得到的結果: Corrupted export在C++中編寫未壓縮的TGA文件

這是正確的出口,我設法得到使用的FreeImage lib目錄下:

FIBITMAP *img = FreeImage_ConvertFromRawBits(pixels,_frameWidth,_frameHeight, 3 * _frameWidth , 24,FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK,0); 
    FreeImage_Save(FIF_TARGA ,img,concatString.c_str()); 

​​

所以我懷疑的東西是錯誤與我的TGA出口代碼:

 GLubyte header[18]={0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 

    header[12] = _frameWidth   & 0xFF; 
    header[13] = (_frameWidth >> 8) & 0xFF; 
    header[14] = (_frameHeight)  & 0xFF; 
    header[15] = (_frameHeight >> 8) & 0xFF; 
    header[16] = 24; 
    // write out the TGA header 
    fwrite(header,sizeof(GLubyte),18,shot); 
    //write out the data: 
    fwrite(pixels,sizeof(GLubyte), _frameWidth * _frameHeight * 3 ,shot); 
    fclose(shot); 

有什麼不對呢?

回答

2

我發現了錯誤。它是錯誤的文件打開模式!

shot=fopen(concatString.c_str(),"w"); 

時,它必須是:

shot=fopen(concatString.c_str(),"wb"); 

「WB」 - 因爲我們打算打開二進制文件。

FreeImage做得很對,因爲它在內部打開文件。

+0

嘿,那個需要一些研究:-) – user1764961 2013-05-14 10:06:24

+1

我不認爲這可能是這個問題,因爲sizeof(GLubyte)是1.但是你說得對,問題幾乎可以肯定是收集「像素」數據,而不是寫出數據。 – 2013-05-14 10:17:26

+0

你確定這是你所做的唯一改變嗎?我期望sizeof(GLubyte)== 1.你是否改變了_frameWidth例如? – GuyRT 2013-05-14 10:22:22

0

看起來你的代碼中的pitch/stride是錯誤的。

+0

什麼樣的答案是? – 2013-05-14 09:26:00

+0

我正在談論持有圖像數據的緩衝區。這裏是更好的音調/大步的解釋:http://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx – user1764961 2013-05-14 09:30:52

+0

緩衝區很好。我讀BGR到字節數組的大小= framewidth * frameheight&3. – 2013-05-14 09:35:48