【问题标题】:SDL surfaces and BMPsSDL 表面和 BMP
【发布时间】:2017-09-11 05:24:18
【问题描述】:

我一直在尝试将 SDL 和 openGL 用于我正在进行的项目,并且为了便于测试,我希望能够以 2D 的形式在屏幕上绘制,这是我发现的唯一允许我这样做的方法这样做是为了创建和绘制 BMP 图像的 SDL 曲面。这很好,因为以后能够保存图像将是一个不错的功能,但是如果有其他更好的方法可以使用 openGL 或其他方法来做到这一点,请说:)。

这是我目前使用的代码:

int w = 255;
int h = 255;
SDL_Surface* surface = SDL_CreateRGBSurface(0,w,h,32,0,0,0,0);
SDL_LockSurface(surface);
int bpp = surface->format->BitsPerPixel;
for (int i = 0; i < h; i++)
{
    for (int j = 0; j < w; j++)
    {
        Uint32 *p = (Uint32 *)surface->pixels + (i * surface->pitch) + (j * bpp);
        *p = SDL_MapRGB(surface->format,i,j,i);
    }
}
SDL_UnlockSurface(surface);
SDL_SaveBMP(surface, "Test.bmp");

这只是一个基本的测试,让我能够了解如何执行此操作,我确定我在这里的内存处理存在一些问题,但我不确定何时删除 *p。我遇到的最大问题是我在哪里使用 SDL_MapRGB。程序在遇到 SIGSEGV 分段错误时崩溃,我无法弄清楚我做错了什么。

【问题讨论】:

    标签: c++ opengl sdl bmp surface


    【解决方案1】:

    你没有释放p指向的内存。

    但使用后,你必须将surface释放为

    SDL_FreeSurface(surface);
    

    另外,bpp 以位为单位。您必须将其除以 8 才能以字节为单位。

    而且,要以字节为单位进行算术运算,您必须使用

    Uint32 *p = (Uint32 *)((Uint8 *)surface->pixels + (i * surface->pitch) + (j * bpp));
    

    【讨论】:

    • 所以我将 bpp 行更改为 int bpp = surface->format->BitsPerPixel / 8,并将字节算术行更改为您所说的,但我收到一个新错误:无法转换 'Uint8* { aka unsigned char*}' 到 'Uint32* {aka unsigned int*}' 在初始化。我只使用 Uint32,因为从我读到的内容来看,这允许我为每个 R、G 和 B 值使用多达 255 个,所以我假设它是我需要的。
    • 没关系,我一时兴起使用了Uint32 *p = (Uint32 *)((Uint8 *)surface-&gt;pixels + (i * surface-&gt;pitch) + (j * bpp)),它起作用了,我只需要转换为Uint32,谢谢!!
    • @Chris:感谢指针转换问题。我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多