c++ - 如何在 SDL 上加载原始像素位图?

标签 c++ 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 header 等。有人可以指出这是否是问题所在吗? 还有其他加载方式吗?

最佳答案

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

我建议使用您想要的尺寸简单地创建一个 SDL_Surface,然后从 this page 修改像素访问方法。获取原始数据或为每个像素调用 putpixel(如果这仅用于测试目的)。

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

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

关于c++ - 如何在 SDL 上加载原始像素位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16619016/

相关文章:

C++ SDL 二维跳跃(重力)

c++ - 如果构造函数不接受任何输入参数,则使用显式构造函数?

c++ - 获取指向迭代器引用的 STL 容器的指针?

c++ - vfprintf 无法正常工作

c# - 如何在 Directwrite 中获取给定字体的可用 OpenType 功能?

c++ - SDL/C++ : How to make this function short(er)?

c++ - 如何通过 C++ 连续写入文本文件并同时通过其他程序(不是 C++)连续读取相同的文本文件?

c链表绘制结构到屏幕

c++ - 使用 Code::Blocks 在 C++ 中编译 Glew 和 SDL

visual-studio-2010 - 如何使用VS2010在Windows上静态编译SDL游戏