将 PNG 加载代码转换为使用 FILE 而不是本地资源
Turn PNG loading code to use a FILE instead of local resource
我正在开发一个小软件,它旨在直接在桌面上显示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;
}
相关文章:
- 具有瞬态资源的RAII类
- Seg Fault Issue C++ (file IO / getline)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 允许从 std::map 的密钥窃取资源?
- 参考资源文件VC++中的$(SolutionDir)
- 如何维护资源管理器项目视图中当前可见的项目列表
- 将 std::allocate_shared 与多态资源分配器一起使用
- 使用RAII在给定次数的迭代后重新分配资源
- 资源管理设计模式
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何跨平台将二进制资源构建到程序中?
- SetDlgItemInt 不会更改嵌入资源的编辑框
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- Klocwork Inside的资源泄漏
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- Visual Studio C++ Project File CustomBuild Task: Filter Outp
- C++链接时间资源"allocation"而不定义
- 使用 Bazel 生成 QT 资源文件
- 将 PNG 加载代码转换为使用 FILE 而不是本地资源