如何在 Visual Studio C++ 中直接“编译图像”为可执行文件?

问题描述 投票:0回答:1

我对 C++ 比较陌生(但不是整体编程),并且我在使用 Visual Studio 编译的 C++ 程序中使用 OpenGL。我想做到这一点,这样我就可以:

  • 让程序员输入图像文件相对于程序文件的文件路径(即
    images/texture.png
  • 在编译时,将该图像的数据与程序文件一起编译,以便 .exe(或 Mac/Linux 等效项)可以访问该图像数据,而无需实际需要与可执行文件位于同一目录中的文件/文件路径(如尽管图像直接编译到 .exe 中,与静态链接库不同)。

目标是使我的程序 100% 位于单个 .exe 中,而无需携带程序员可能希望用户无法访问或修改的各种数据文件(即图像) .

就目前而言,我的程序已经静态链接所有正在使用的库,因此编译器输出只是一个 .exe (和一个 .pdb),但该程序仍然依赖于需要访问图像文件(我必须复制到)同一目录中。再说一次,我想要一个可以在我的系统(也可能在其他系统)上的任何地方单独运行并具有程序功能的 .exe。

我听说过资源文件,它们可能是这个问题的解决方案,但我几乎没有找到任何关于它们的可用信息;我发现的所有内容都是关于 C# 或 dotnet 的,这两者都不适用于我的程序。由于我不熟悉 C++,我可能只是误解了我的研究。

我觉得我错过了一些明显的东西。有人可以帮我解惑吗?

c++ visual-studio visual-c++
1个回答
0
投票

在 Visual Studio C++ 项目中 -> 添加新项目:资源文件(.rc)。

右键单击resource.rc文件->查看代码。

在resource.rc中添加

IDB_MY_IMAGE PNG "your path\\texture.png"

在resource.h(自动创建)第一行添加

#define  IDB_MY_IMAGE 10001
。 10001是自定义ID。

测试代码:

#include<Windows.h>
#include<iostream>

#include"resource.h"
int main() {
    //load the resource
    HMODULE hModule = GetModuleHandle(NULL);
    HRSRC hResource = FindResource(hModule, MAKEINTRESOURCEW(IDB_MY_IMAGE), L"PNG");
    DWORD imageSize = SizeofResource(hModule, hResource);
    HGLOBAL hGlobal = LoadResource(hModule, hResource);
    LPVOID imageBuffer = LockResource(hGlobal);

   unsigned char* imageData = new unsigned char[imageSize];
    memcpy(imageData, imageBuffer, imageSize);

    /* Display the png here*/
    ////////////////
  

    ////////////////
    UnlockResource(hGlobal);
    FreeResource(hGlobal);
    delete[] imageData;
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.