如何将文件嵌入到可执行文件中?

新手上路,请多包涵

我有一个用 C++ 编写的小型演示可执行文件,它只依赖于在运行之前加载一个 5kb 的 PNG 图像,该图像用于我制作的像素文本。由于这个文件,我需要提供一个 ZIP 存档而不是一个可执行文件,这会在下载和“播放”之间产生足够的摩擦,我相信这会阻止一些人尝试它。

我的问题是, 无论如何将PNG文件(以及任何其他文件)嵌入到可执行文件或源代码中,使其成为单个文件,并且可执行文件可以使用它?

我有能力将 PNG 解析为字节流,因此不需要将其转换为像素数据。

提前致谢! (存在与此类似标题的其他问题,但它们及其答案似乎涉及更具体的问题并且不是很有帮助)

编辑:编译器是 Visual C++ 2010,这是在 Windows 上(虽然我想避免使用 Windows 特定的实用程序)

edit2 :Alf 的回答似乎是最便携的方法,所以我很快编写了一个函数来将 PNG 文件解析为 TXT 或头文件,可以将其读取为 unsigned char 数组。这种形式似乎与 PNG 文件本身相同,但我的 png 加载器不接受该数组。从内存中加载它时,PNG 解析器会采用 (void * buffer, size_t length) 如果重要的话。

如果您想查看代码,但如果您认为它们比这种方法更好,我仍然会接受其他答案:

 void compileImagePNGtoBinary(char * filename, char * output){

    FILE * file = fopen(filename, "rb");
    FILE * out = fopen(output, "w");

    unsigned char buffer[32];
    size_t count;
    fprintf(out, "#pragma once \n\n static unsigned char TEXT_PNG_BYTES[] = { ");
    while(!feof(file)){
            count = fread(buffer, 1, 32, file);

            for(int n = 0; n < count; ++n){
                    fprintf(out, "0x%02X, ", buffer[n]);
            };
    };
    fprintf(out, "};");
    fclose(file);
    fclose(out);

};

最终编辑:Alf 还提到的 ImageMagick 正是我所需要的,谢谢!

原文由 Anne Quinn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 700
2 个回答

一种可移植的方法是定义一个函数,如

typedef unsigned char Byte;

Byte const* pngFileData()
{
    static Byte const data =
    {
        // Byte data generated by a helper program.
    };
    return data;
}

然后您所要做的就是编写一个小帮助程序,将 PNG 文件作为二进制文件读取并生成 C++ 花括号初始化文本。 编辑:@awoodland 在对该问题的评论中指出, ImageMagick 有这样一个小助手程序……

当然,对于特定于 Windows 的程序,改为使用普通的 Windows 资源方案。

干杯&hth.,

原文由 Cheers and hth. - Alf 发布,翻译遵循 CC BY-SA 3.0 许可协议

Base64 对文件进行编码并将其放在代码中某处的字符串中;)

原文由 fabrizioM 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题