2013-05-17 26 views
1

目前我使用SDL应用程序的bmp文件,但我想隐藏它们来分发我的exe文件。我认为将它们作为原始字节移动到头文件中是一种好方法,因为BMP非常简单。黑色&白色模式。如何在SDL上加载原始像素位图?

我不确定这是否可以通过只使用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头,等有人能指出如果是这样的问题? 是否有另一种方式加载?

回答

2

这不起作用的原因是因为您的数据不代表位图,而是原始像素数据。如果您想查看原始位图的外观,只需在绘图中创建一个,然后在十六进制编辑器中打开它即可看到标题,然后显示实际的像素数据。

我会建议简单地使用你想要的尺寸创建SDL_Surface然后将其从this page修改像素访问方法取原始数据或致电putpixel为每一个你的像素(如果这只是用于测试目的) 。

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

您可能会发现this document也很有趣。

+0

球场的点是什么?我的意思是为什么音调不同于图像中的宽度?我知道使用SSE/AVX它有助于使宽度成为4或8的倍数,所以间距和宽度可以不同,但​​这是我所知道的唯一例子。我想知道是否有更常见的例子? – 2013-05-18 07:18:06

+0

此线程有很多关于球场的解释:) http://forums.libsdl.org/viewtopic.php?t=4544&sid=dd7f398958ed1ddd4cbbae9a903bcd5b – emartel

+0

谢谢!这正是我正在寻找的讨论类型。 – 2013-05-18 19:28:42