关于C#:SDL表面和BMP

SDL surfaces and BMPs

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

这是我当前正在使用的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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分段错误而击中该程序时崩溃,我无法弄清楚自己在做什么错。


您不会释放p指向的内存。

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

1
SDL_FreeSurface(surface);

此外,bpp以位为单位。您必须将其除以8才能获得字节数。

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

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