2012-01-16 3 views
4

김프에서 이미지를 C 헤더 파일로 저장할 수 있습니다. 나는 아래의 이미지처럼 보이는 XPM 파일로 그렇게 :GIMP에서 생성 된 헤더 픽셀 설명 XPM 이미지의 C 헤더 파일

나는 C 헤더 파일, GIMP를 출력 this C header file으로 XPM 이미지를 저장한다면.

주어진 이미지 데이터의 각 픽셀을 처리하기 위해 헤더 픽셀이 반복적으로 호출됩니다. 내가 이해할 수없는 것은 헤더 픽셀이 처음부터 데이터를 처리하는 것입니다. 내가 another person's code에서 사용을 보았을 때

#define HEADER_PIXEL(data,pixel) {\ 
pixel[0] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4)); \ 
pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2)); \ 
pixel[2] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33))); \ 
data += 4; \ 
} 

, 그들은 바이트 순서가 잘못된 순서로했다 진술하고 그것을 자신을 재 배열. 그들은 이런 식으로 그것을 사용 :

char *pixel, *data = header_data; 
int i = width * height; 
*processed_data = pixel = malloc(i * 4 + 1); 
while(i-- > 0) { 
    pixel[0] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33))); 
    pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2)); 
    pixel[2] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4)); 
    pixel[3] = 0; 
    data += 4; 
    pixel += 4; 
} 

하지만 정말 나를 변화 모든 비트와 무슨 일이 일어나고 있는지 이해하고 비트 또는의와 "왜 마이너스 33?"하지 않았다 기타 등등. 헤더에있는 이미지 데이터를 처리 할 대상에 대해 설명 할 수있는 사람이 있으면 크게 환영 할 것입니다.

미리 감사드립니다.

+0

ASCII 33은'!'입니다. 나는 그 base64 또는 비슷한 것을 추측 할 것이다. –

답변

3

각 픽셀은 3 바이트로 표시됩니다. 이 픽셀은 header_data이라는 문자 배열로 정의됩니다.

문제는 모든 바이트가 해당 헤더 파일에있을 수있는 인쇄 가능한 문자 인 것은 아닙니다.

인쇄 가능한 문자 33부터 97까지만 사용하면이 문제를 해결할 수 있습니다. 그러면 6 비트의 정보가 제공되므로 4 문자마다 24 비트가 주어지며 3 바이트의 모든 순열을 나타낼 수 있습니다.