2013-06-20 122 views
4

我試圖保存一個尺寸爲5x5像素的圖像,用glReadPixels將其讀取到使用SOIL的文件中。將屏幕的一部分保存到文件(SOIL和glReadPixels)

我讀的像素:

int x = 400; 
int y = 300; 
std::vector< unsigned char* > rgbdata(4*5*5); 
glReadPixels(x, y, 5, 5,GL_RGBA,GL_UNSIGNED_BYTE, &rgbdata[0]); 

然後我嘗試拯救與土壤的讀取數據保存圖像功能

int save_result = SOIL_save_image 
    (
    "image_patch.bmp", 
    SOIL_SAVE_TYPE_BMP, 
    5, 5, 4, 
    rgbdata[0] 
    ); 

但是,試圖保存圖像時,我得到一個未處理的異常。

溶液(基督教RAU)

int x = 400; 
int y = 300; 
std::vector< unsigned char > rgbdata(4*5*5); 
glReadPixels(x-(5/2), y-(5/2), 5, 5,GL_RGBA,GL_UNSIGNED_BYTE, &rgbdata[0]); 

int save_result = SOIL_save_image 
    (
    "image_patch.bmp", 
    SOIL_SAVE_TYPE_BMP, 
    5, 5, 4, 
    rgbdata.data() 
    ); 
+0

您將需要添加更多詳細信息... –

回答

5

你正在創建的指針爲unsigned char(std::vector<unsigned char*>的載體,但你想要的是剛剛爲unsigned char(std::vector<unsigned char>)的載體。

並且在SOIL_save_image的調用中,您不必給它rgbdata[0],它將是一個單一的無符號字符(並且您的不正確矢量類型是一個未初始化的指針,可能導致一些內存訪問錯誤),但是指向完整的數據,因此rgbdata.data()(或&rgbdata[0],如果你沒有C++ 11)。

+0

謝謝。它現在可以工作,但是我只能得到黑色圖像補丁。當我得到它時,我會發布我的解決方案。 –

+0

你忘了*。除此之外,+1。 – Kevin

+0

@凱文謝謝,讓答案更令人困惑。 –

0

還要注意:

GL的默認包/解壓縮圖像寬度的應的倍數,也就是說,在widthglReadPixels(x, y, width, height, format, type, data)滿足條件width % 4 == 0

如果width % 4 != 0(你的情況5 % 4 != 0),它可能導致意外的結果。所以你也必須避免這些問題,這裏是解決方案:

glPixelStorei(GL_UNPACK_ALIGNMENT,1); 
glPixelStorei(GL_PACK_ALIGNMENT,1); 
相關問題