2017-04-14 1 views
1

나는 프로젝트 Im에서 작업하기 위해 SDL 및 openGL을 사용하고 있으며 쉬운 테스트를 가능하게하기 위해 2D로 화면에 그리려하고 내가 찾은 유일한 방법이 필요합니다. 이를 위해 BMP 이미지를 만들고 그리는 SDL 서피스가 있습니다. 나중에 이미지를 저장하는 것이 좋은 기능이지만 나중에 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으로 나눠야합니다.

는 그리고 바이트 연산을 수행하는, 당신은 당신이 무엇을 내가 BPP = 표면 -> 포맷팅 및> BitsPerPixel/8 및 바이트 산술 라인을 int로하는 BPP 라인을 변경

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

사용해야합니다 말했다하지만 새로운 오류 : 초기화 'Uint32 * (일명 서명되지 않은 char *)'Uint32 * {일명 서명되지 않은 int *} '변환 할 수 없습니다. 나는 Uint32만을 사용했기 때문에 내가 읽었던 것에서 R, G, B 값 각각을 최대 255 개까지 사용할 수있게되어서 내가 필요로하는 것을 가정했다. – Chris

+1

전혀 신경 쓰지 않고,'Uint32 * p = (Uint32 *) (Uint8 *) surface-> pixels + (i * surface-> pitch) + (j * bpp))'를 변덕스럽게 사용해 보았습니다. 덕분에 Uint32로 변환해야했습니다! – Chris

+0

@Chris : 포인터 캐스트 문제에 대해 감사드립니다. 나는 나의 대답을 업데이트했다. –