2013-07-31 2 views
2

비트 맵에서 픽셀 데이터를 구조화 된 배열 (색상의 R, G 및 B int 포함)로 읽으려고합니다. 12 x 12 픽셀 이미지를 테스트 용으로 사용하고 있습니다. bmp 사양에서는 픽셀 데이터가 각 행의 끝에 0으로 채워져 단어 맞춤을 수행한다고 말하기 때문에 12 픽셀 너비가 자동으로 워드에 맞춰집니다.배열 C에 BMP 픽셀 데이터로드

여기서 생성 내가 사용 코드. INFOHEADERFILEHEADER 완벽 파싱 및 IMAGE S im의 12 × 12의 2 차원 배열. 그러나 각각의 화소가 인쇄를위한 RGB 데이터를 인쇄 졸작이다.

typedef struct __attribute__((__packed__)) { 
    unsigned char b; 
    unsigned char g; 
    unsigned char r; 
} IMAGE; 

int main(void) { 
    FILEHEADER fh; 
    INFOHEADER ih; 
    FILE *img = fopen("pic.bmp", "rb"); 
    fread(&fh, sizeof(unsigned char), sizeof(FILEHEADER), img); 
    fread(&ih, sizeof(unsigned char), sizeof(INFOHEADER), img); 

    IMAGE im[ih.width][ih.height]; 
    fseek(img, fh.imageDataOffset, 0); 
    int i, j; 
    for (i = ih.height-1; i >= 0; i--) { 
     for (j = 0; j < ih.width; j++) { 
      fread(&im[i][j], sizeof(unsigned char), sizeof(IMAGE), img); 
      printf("%x%x%x ", im[i][j].r, im[i][j].g, im[i][j].b); 
     } 
     printf("\n"); 
    } 
    printf("w = %d, h = %d\n", ih.width, ih.height); 
} 

그러나 대한 12x12 픽셀의 완전히 흰색 인 비트 맵이면 다음을 출력합니다.

ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
000 ca800 ff574b 007f 001 000 b000 574bc9 07fff 44c40 ff8690 007f 
9077b0 7fff86 8000 574bca 07fff 0a00 ff7482 007f 4bc950 7fff57 2f00 86906d 
07fff 60a50 ff8690 007f 4bc9d0 7fff57 ee00 87418 000 c9300 ff574b 007f 
4bc8f0 7fff57 700 868b3c 07fff 400 000 000 820a0 7fff74 3000 574bc9 
07fff 6000 1877 000 0100 000 000 004 000 1000 000 000 
820a0 7fff74 000 0010 000 6000 1874 000 4bc8d0 7fff57 b300 868b31 
000 38b30 051f9 000 000 000 000 000 000 010 000 000 
745069 018 f700 ffffff 181a4 080 000 000 01f5 0140 000 000 

내가 뭘 잘못하고 있는지 누가 알 수 있습니까? 그것은 정렬 문제가 될 수 있을까요?

감사

편집 :이 비트 맵 파일의 맨 아래의 스크린 샷이다

. 144 (12x12) 개의 흰색 픽셀 (강조 표시된)이있는 것으로 보입니다. 마지막 두 개의 0은 패딩입니다. 내 프로그램이 이것을 제대로 분석하지 못하는 것은 여전히 ​​의미가 없습니다.

enter image description here

+2

읽기 루프에서 높이와 너비를 바꾸고 있습니다. 여기 (정사각형 이미지의 경우)는 아니지만 문제를 해결하고 싶을 수 있습니다. sizeof (IMAGE)가 3인지 확인할 수 있습니까? 또한, 16 진수 뷰어에서 BMP 이미지를 열고 rgb 세 쌍 사이에 0 패딩 바이트가 없는지 확인할 수 있습니까? – usr2564301

+0

예 sizeof (IMAGE)는 3입니다. 내 덧씌우 기 편집을 참조하십시오 –

+0

압축을 푼 구조체를 사용하려고 했습니까? – urzeit

답변

1

좋아 내가이 8 비트 대신 24 비트 나의 빈 BMP 파일을 저장 한 것으로 나타났다. 8 비트는 색상 표를 사용하며 각 픽셀은 색상 표의 항목을 참조하여 데이터를 가져옵니다. 24 비트 bmp는 픽셀 당 3 바이트를 사용하며 각 바이트는 R, G 및 B 값을 나타내므로 색상 표가 필요하지 않습니다.