转动PNG加载代码以使用FILE而不是本地资源

时间:2012-09-24 21:31:44

标签: c++ windows file png hbitmap

我正在开发一个小软件,它意味着直接在桌面上显示一个png文件。我找到了一种用HBITMAP结构做后期部分的方法。然而,我花了几天时间寻找一种方法将.PNG文件加载到这样的HBITMAP。

我发现eventuall(我也可以编译)的代码就是这个页面的代码:

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

认为它会完美运作。我的问题是,这个是用于已经附加的.png文件。

但我需要在运行时使用(在编译时)未知位置的文件。

那么我怎么能改变那个脚本来实现呢? 不幸的是,我的C ++知识不是最好的,而且相关函数的MS文档也没有真正帮助:/

我会非常感激!

1 个答案:

答案 0 :(得分: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;
}