如何在SDL上加载原始像素位图



目前我使用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头等。谁能指出这是问题所在吗?还有其他的加载方式吗?

这不起作用的原因是因为您的数据不代表位图,它是原始像素数据。如果你想看看一个原始的位图是什么样子,只需在油漆中创建一个,然后在十六进制编辑器中打开它,你会看到标题,然后是实际的像素数据。

我建议简单地使用你想要的尺寸创建一个SDL_Surface,然后从这个页面修改像素访问方法来获取原始数据,或者为每个像素调用putpixel(如果这只是为了测试目的)。

根据一些因素,您的所有像素将不是内存中连续的值数组,您将需要考虑SDL_Surfacepitchbpp(字节每像素)。在你的情况下,我假设它是一个8位(1字节)像素?在这种情况下,可以很容易地一行一行地填充pixels数据,每次移动pitch的行指针。

你可能也会觉得这个文档很有趣。

最新更新