SDL将图像嵌入程序可执行文件中
是否可以使用可在运行时使用的SDL在程序中嵌入图像。
例如,我有一个程序在启动时显示包含徽标和版权信息的启动画面。 而不是将此图像放在位图文件中,并使用SDL_LoadBMP将其加载到SDL_Surface。 我想将图像嵌入到程序二进制文件中,以阻止某人可能更改启动图像和版权名称。
有没有人对如何做到这一点有任何建议? 示例代码会很棒。
将文件嵌入可执行文件很容易,但有一些问题,有几种方法可以做到这一点,包括一些便携式和非便携式方式。
将图像转换为C代码
编写一个脚本将图像转换为C中的常量数组。脚本在Python中看起来像这样:
#!/usr/bin/env python3 print("static const unsigned char IMAGE_DATA[] = {{{}}};".format( ",".join(str(b) for b in open("myimage.bmp", "rb").read())))
只需将输出传递给*.h
文件,并将该文件包含在另一个文件中。 您可以使用sizeof(IMAGE_DATA)
获取文件的大小。
优点:便携
缺点:需要安装Python,如果数组太大而无法编译,则无法工作,需要向构建系统添加自定义步骤
将图像转换为目标文件
这更依赖于平台。 在使用GNU binutils工具链(例如Linux)的平台上,您可以使用objcopy
,我认为bin2obj
适用于Microsoft工具链。
优点:无处不在
缺点:不可移植,需要向构建系统添加自定义步骤,自定义步骤可能很难实现
在GNU binutils工具链上,使用objcopy
objcopy
程序允许您指定binary
作为输入格式,但是您需要明确指定体系结构…因此您必须修改i386和x64版本的可执行文件的命令。
$ objcopy --input binary --output elf32-i386 --binary-architecture i386 \ myimage.bmp myimage.o
您可以使用以下声明从C获取数据:
// Ignore the fact that these are char... extern char _binary_myimage_bmp_start, _binary_myimage_bmp_end; #define MYIMAGE_DATA ((void *) &_binary_myimage_bmp_start) #define MYIMAGE_SIZE \ ((size_t) (&_binary_myimage_bmp_end - &_binary_myimage_bmp_start))
使用汇编程序指令
矛盾的是,在汇编程序中嵌入静态文件相当容易。 汇编程序通常有.incbin
(与GAS和.incbin
一起使用)等指令。
优点:无处不在
缺点:不可移植,汇编语法在平台之间是不同的
(Windows)将文件作为资源嵌入
在Windows上,您可以将资源嵌入EXE中,然后使用库调用获取资源。
优点:如果你在Windows上可能最简单
缺点:仅适用于Windows
您可以将图像导出为.xpm格式(在gimp中)并将其包含在您的代码中。 但是您需要SDL_Image.h将其加载为SDL_Surface。
正如本文所述 ,非常简单:
//To create a surface from an XPM image included in C source, use: SDL_Surface *IMG_ReadXPMFromArray(char **xpm);
C / C ++中的一个例子:
#include #include "test.xpm" #include SDL_Surface *image; SDL_Surface *screen; int main(int argc, char **argv) { SDL_Init(SDL_INIT_EVERYTHING); screen = SDL_SetVideoMode(800,600,32,SDL_SWSURFACE); image = IMG_ReadXPMFromArray(test_xpm); //the .xpm image is a char array. "test_xpm" is the name of the char array SDL_Rect offset; offset.x = 0; offset.y = 0; SDL_BlitSurface(image,NULL,screen,&offset); SDL_Flip(screen); SDL_Delay(5000); return 0; }
我希望这有帮助。
使用gimp,您可以将图像保存为c代码。