目前我将 bmp 文件用于 SDL 应用程序,但我想隐藏它们以分发我的 exe。我认为将它们作为原始字节移动到头文件中是一个好方法,因为 BMP 是非常简单的黑白模式。
我不确定仅使用 SDL 是否可行,但到目前为止我无法加载简单的位模式。
// data.h
const unsigned char rawPixels[] =
{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF,
};
// main.cpp
...
SDL_RWops *pixelsWop = SDL_RWFromConstMem((const unsigned char *)rawPixels, sizeof(rawPixels));
SDL_Surface *pixelsSurface = SDL_LoadBMP_RW(pixelsWop, 1);
SDL_BlitSurface(pixelsSurface, NULL, NULL, NULL);
...
我只从 SDL_LoadBMP_RW 调用中得到一个空表面,也许数组应该包含正确的 BMP header 等。有人可以指出这是否是问题所在吗? 还有其他加载方式吗?
最佳答案
这不起作用的原因是因为您的数据不代表位图,它是原始像素数据。如果您想查看原始位图的外观,只需在 Paint 中创建一个并在十六进制编辑器中打开它,您将看到标题,然后是实际的像素数据。
我建议使用您想要的尺寸简单地创建一个 SDL_Surface
,然后从 this page 修改像素访问方法。获取原始数据或为每个像素调用 putpixel
(如果这仅用于测试目的)。
根据一些因素,您的所有像素都不会是内存中的连续值数组,您需要考虑 SDL_Surface
的 pitch
和bpp
(每像素字节数)。在您的情况下,我假设它是 8 位(1 字节)像素?在这种情况下,逐行填充 pixels
数据可能非常容易,每次移动 pitch
的行指针。
您可能会发现 this document也很有趣。
关于c++ - 如何在 SDL 上加载原始像素位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16619016/