2017-04-14 38 views
1

我一直在嘗試使用SDL和openGL進行一個項目我的工作,並且啓用簡單的測試,我希望能夠在2D中繪製屏幕以及我找到的唯一方法讓我做到這一點是SDL曲面創建和繪製BMP圖像。這很好,因爲能夠保存圖像稍後會是一個不錯的功能,但如果有另一種更好的方法來使用openGL或其他方法做到這一點,請說:)。SDL曲面和BMP

這是我目前使用的代碼:

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分段錯誤,我不知道我做錯了什麼。

回答

1

您不釋放p指出的內存。

但使用後,你必須釋放surface作爲

SDL_FreeSurface(surface); 

此外,bpp是位。你必須將它除以8以獲得它的字節數。

而且,要做到以字節爲單位的運算,你必須使用

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

所以我改變了BPP線爲int BPP =表面 - >格式 - > BitsPerPixel/8,位運算行你說,但我得到一個新的錯誤:不能在初始化中將'Uint8 * {aka unsigned char *}'轉換爲'Uint32 * {aka unsigned int *}'。我只使用Uint32,因爲從我讀的內容來看,它允許我對每個R,G和B值使用高達255的值,所以我假定它是我需要的。 – Chris

+1

沒關係,我隨心所欲地運用了'Uint32 * p =(Uint32 *)((Uint8 *)surface-> pixels +(i * surface-> pitch)+(j * bpp))'需要轉換爲Uint32,謝謝! – Chris

+0

@Chris:感謝指針投射問題。我已經更新了我的答案。 – 2017-04-15 11:32:21