2013-08-04 4 views
1

24 비트 색상을 사용하여 비트 맵 파일을 만드는 프로그램을 만들고 있습니다.비트 맵 픽셀 배열 채우기

3 단계로 파일을 쓰고 있는데, 먼저 FileHeader를 작성한 다음 InfoHeader를 작성한 다음 픽셀 데이터를 작성합니다. 각 행이 단어 경계에서 끝나도록 픽셀 데이터를 채우는 데 문제가 있습니다.

아래 코드는 가끔인데 while 회선이없는 경우에만 사용됩니다 (줄 끝에 패딩이 추가됨). 예를 들어 12x12 픽셀 이미지의 경우 24x24 크기로 조정할 수 있지만 10x10 크기로 조정할 수는 없습니다 (파일이 손상됨). 아래 패딩 코드를 삽입하면 이미지가 왜곡되어 가끔 손상됩니다.

나는 무엇이 잘못 될지 알 수 없습니다. 아래의 코드는 단어 경계에 도달 할 때까지 각 줄의 끝에 패딩을 추가하고 다음 줄을 시작해야합니다.

fwrite(&fh, 1, sizeof(FILEHEADER), n_img); 
fwrite(&ih, 1, sizeof(INFOHEADER), n_img); 
int i, j; 
uint8_t pad = 0; 
for (i = height-1; i >= 0; i--) { 
    for (j = 0; j < width; j++) 
     fwrite(n_pix+(i*width)+j, 1, sizeof(IMAGE), n_img); 

    while(ftell(n_img)%4 != 0) 
     fwrite(&pad, 1, 1, n_img); 
} 
+0

그래서 픽셀의 사각형으로 만들지 않고 단어 경계에서 각 행을 완성 하시겠습니까? – shrm

답변

4

당신은 워드 크기에 행을 패딩하지 않습니다, 당신은 현재 파일 위치 패딩된다. 헤더의 크기가 4의 배수가 아닌 최대 54 개가되기 때문에 작동하지 않습니다.

ftell을 사용하여 '현재 위치'를 검색하는 대신 maths를 사용하십시오. 여러분의 pad 부호없는 긴 확인하고 루프 전에 삽입 :

int npad = (sizeof(IMAGE)*width) & 3; 
if (npad) 
    npad = 4-npad; 

다음, 대신 while(ftell .. 루프의 즉시 필요한 바이트 수를 쓰는 : 0

fwrite (&pad, 1,npad, n_img); 

npad 범위 것입니다. .3이기 때문에 pad을 4 바이트 정수로 만들어야합니다.

+0

오, 그래서 파일의 시작 부분에 상대적이 아닌 픽셀 데이터의 시작 부분에 상대적으로 채워야 했습니까? –

+2

예, [Microsoft 참조] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd318229(v=vs.85)asp)에서 "표면 보폭 계산"을 참조하십시오. – usr2564301

관련 문제