2014-11-29 9 views
1

그레이 스케일 그림을 나타내는 uint8_t의 배열이 있습니다. 각 픽셀은 uint8_t입니다. 나는 이것을 SDL2 라이브러리를 사용하여 창에 표시하고 싶습니다.SDL2의 그레이 스케일 이미지

제가

mSurface = SDL_CreateRGBSurfaceFrom(mData, mWidth, mHeight, 8, mWidth, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000); 

그러나 수행하여 배열에서 SDL_Surface를 만드는 시도 상기 문제는 (I 여기했을으로) 8 비트의 깊이가있어서, SDL_CreateRGBSurfaceFrom 전달 될 때 SDL2 wiki "깊이가 4 또는 8 비트이면 빈 팔레트가 표면에 할당됩니다." 그렇지 않은 경우 SDL에 각 픽셀이 1 바이트임을 알리고 R, G 및 B 값으로 해당 바이트를 사용합니다.

내 데이터가 저장되는 방식이므로 픽셀 당 8 비트의 깊이가 필요하지만 팔레트를 사용하고 싶지 않습니다.

SDL이 pallete를 원하지 않는다고 할 수있는 방법이 있습니까? r, g 및 b 마스크가 모두 해당 바이트로 설정되어있는 이미지 만 표시합니까?

다른 해결책은 각 바이트를 세 번 복사 한 다음 회색조 이미지를 RGB로 변환하는 것입니다. 그러나 모든 복사가 느리기 때문에 가능하면 그렇게하지 않는 것이 좋습니다.

답변

1

SDL_CreateRGBSurfaceFrom()은 8 비트 트루 컬러 포맷을 처리하지 않습니다. 언급했듯이 8 비트 깊이의 빈 팔레트를 만듭니다. 가장 확실한 일은 팔레트를 채우고 그것의 일을하게하는 것입니다. 또한

SDL_Color colors[256]; 
int i; 

for(i = 0; i < 256; i++) 
{ 
    colors[i].r = colors[i].g = colors[i].b = i; 
} 

SDL_SetPaletteColors(mSurface->format->palette, colors, 0, 256); 

, 엄지 손가락의 규칙 :

는 여기에 그레이 스케일 팔레트에 대한 몇 가지 코드를 그냥 "느린"것에 대해 작동하는 것을 방지하지 마십시오. "너무 느리다"는 것을 피하십시오. 어떤 것을 "너무 느린"경우에만 시도해 보면 알 수 있습니다.

이 경우 이미지를 한 번만로드하면 성능 효과가 미미합니다.