2012-09-24 11 views
2

我正在研究一個小軟件,它可以直接在桌面上顯示png文件。我發現了一種用HBITMAP結構做後面部分的方法。然而,我已經花了幾天時間尋找一種將.PNG文件加載到這種HBITMAP的方法。打開PNG加載代碼以使用FILE而不是本地資源

我發現eventuall(這也是我可以編譯)的代碼是這樣一個從該頁面:

http://logiklabs.tumblr.com/post/22946728048/how-to-load-an-image-resource-into-a-hbitmap

認爲這將很好地工作。我的問題是,雖然這是爲了使用已附加的.png文件。

然而,我需要在運行時使用(在編譯時)未知位置的文件的可能性。

那麼我怎麼能改變那個腳本來實現呢? 我的C++知識不是最好的遺憾,MS相關函數的文檔也沒有真正幫助:/

我會非常感謝!

+0

歡迎使用Stack Overflow,DragonGamer! –

回答

3

看起來您可以將PNG文件加載到RAM中,並將其地址和長度傳遞給stbi_load_from_memory()。您基本上更改鏈接頁面上代碼的第一部分以將文件加載到RAM中,然後繼續執行。示例如下:

static HBITMAP LoadImageResource(LPCTSTR filename) 
{ 
    unsigned char *res_data, *splash_image; 
    DWORD res_size; 
    int width, height, components; 
    BITMAPV5HEADER bmh; 
    HBITMAP hBitmapRet; 
    FILE* f = _tfopen(filename, "rb"); 

    if (!f) 
     return NULL; 

    fseek(f, 0, SEEK_END); 
    res_size = ftell(f); 
    rewind(f); 

    res_data = new unsigned char[res_size]; 
    fread(res_data, sizeof(unsigned char), res_size, f); 
    fclose(f); 

    splash_image = stbi_load_from_memory(res_data, res_size, &width, &height, &components, 0); 

    ZeroMemory(&bmh, sizeof(BITMAPV5HEADER)); 
    bmh.bV5Size = sizeof(BITMAPV5HEADER); 
    bmh.bV5Width = width; 
    bmh.bV5Height = -height; 
    bmh.bV5Planes = 1; 
    bmh.bV5BitCount = 32; 
    bmh.bV5Compression = BI_BITFIELDS; 
    bmh.bV5RedMask = 0x00FF0000; 
    bmh.bV5GreenMask = 0x0000FF00; 
    bmh.bV5BlueMask = 0x000000FF; 
    bmh.bV5AlphaMask = 0xFF000000; 

    hBitmapRet = CreateDIBitmap(GetDC(NULL), (BITMAPINFOHEADER *) &bmh, CBM_INIT, 
        splash_image, (BITMAPINFO *) &bmh, DIB_RGB_COLORS); 

    stbi_image_free(splash_image); 
    delete[] res_data; 
    return hBitmapRet; 
} 
+0

非常非常感謝你,認爲工作! :) – DragonGamer

+0

不客氣。我很高興能夠提供幫助。在Stack Overflow上,您可以接受答案(即單擊上/下投票按鈕下方的複選標記圖標)表示感謝。 –

相關問題