2011-06-24 76 views
2

我使用FreeImage庫來處理加載圖像並將它們傳遞給OpenGL。目前,我支持從文件中讀取圖像。不過,我想將此擴展爲能夠從遊戲內容包的變量中讀取變量。基本上,總之,我有整個文件,標題和所有,寫入一個無符號的char *。我想利用這個緩衝和做類似的事情這與它(假設變量FIF聲明):從內存中檢索圖像數據

FIBITMAP * dib = FreeImage_Load(fif, "someImage.png"); 

但不是someImage.png,我想指定無符號字符*(可以稱之爲緩衝區這個問題的緣故)。圖書館裏有沒有辦法可以處理這樣的事情?

編輯:我應該有點更具體考慮「someImage.png」可以被認爲是一個無符號的char *。

要清除混亂了,如果有的話,無符號字符*緩衝的價值將通過這樣的僞代碼確定:

fileStream = openFile "someImage.png" 
    unsigned char * buffer = fileStream.ReadToEnd 

回答

5

這聽起來像你想使用FreeImage_ConvertToRawBits。以下是文檔中的示例:

// this code assumes there is a bitmap loaded and 
    // present in a variable called ‘dib’ 
    // convert a bitmap to a 32-bit raw buffer (top-left pixel first) 
    // -------------------------------------------------------------- 
    FIBITMAP *src = FreeImage_ConvertTo32Bits(dib); 
    FreeImage_Unload(dib); 
    // Allocate a raw buffer 
    int width = FreeImage_GetWidth(src); 
    int height = FreeImage_GetHeight(src); 
    int scan_width = FreeImage_GetPitch(src); 
    BYTE *bits = (BYTE*)malloc(height * scan_width); 
    // convert the bitmap to raw bits (top-left pixel first) 
    FreeImage_ConvertToRawBits(bits, src, scan_width, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, TRUE); 
    FreeImage_Unload(src); 
    // convert a 32-bit raw buffer (top-left pixel first) to a FIBITMAP 
    // ---------------------------------------------------------------- 
    FIBITMAP *dst = FreeImage_ConvertFromRawBits(bits, width, height, scan_width, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, FALSE); 
+0

這可能是我需要的,我會試一試。 +1! – MGZero

+0

對不起,你能解釋一下音高參數究竟做了什麼嗎?我從文檔中不能理解它,可能是因爲我不知道掃描線是什麼。 – MGZero

+0

Pitch是圖像每行的字節數。爲了對齊和性能的原因,它通常被填充爲比圖像的寬度稍大。如果你的圖像緊湊,它將只是每像素寬度*字節。 – Mikola

0

使用FreeImage_LoadFromHandle。您需要創建3個可以訪問緩衝區的函數,並將這些函數的地址放在FreeImageIO結構中。