gpt4 book ai didi

c++ - 将 PNG 加载代码转为使用 FILE 而不是本地资源

转载 作者:可可西里 更新时间:2023-11-01 10:07:39 26 4
gpt4 key购买 nike

我正在开发一个可以直接在桌面上显示 png 文件的小软件。我找到了一种使用 HBITMAP 结构来完成后面部分的方法。然而,到目前为止,我已经花了几天时间寻找将 .PNG 文件加载到此类 HBITMAP 的方法。

我最终找到的代码(我也可以编译)是这个页面中的代码:

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

认为它会完美运行。我的问题是,虽然这个是为了使用已经附加的 .png 文件。

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

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

我将非常感谢!

最佳答案

看起来您只需将 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;
}

关于c++ - 将 PNG 加载代码转为使用 FILE 而不是本地资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12573218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com