2016-09-24 6 views
2

PGM 파일을 읽는 라이브러리를 만들고 있는데이 문제가 생겼다.C에서 바이너리 PGM 읽기

은 따라서 단지 "노이즈"

코드로 이미지를 생성, 잘못된 값을 읽어처럼 제대로 이진 PGM 이미지를 읽을 수 없습니다 내 코드가 보이는

은 정말 간단 입니다 :

void OpenPGM(PGMImage* pgm, const char* file){ 
    FILE *pgmfile = fopen (file, "rb"); 

    fscanf (pgmfile, "%s", pgm->magicNumber); 
    fscanf (pgmfile, "%d %d", &(pgm->width),&(pgm->height)); 
    fscanf (pgmfile, "%d", &(pgm->maxValue)); 

    pgm->data = malloc(pgm->height * sizeof(unsigned char*)); 

    if (pgm->magicNumber[1] == '2') 
    { 
     for (int i = 0; i < pgm->height; ++i) 
     { 
      pgm->data[i] = (unsigned char*)malloc(pgm->width * sizeof(unsigned char*)); 
      for (int j = 0; j < pgm->width; ++j)    
       fscanf (pgmfile, "%d", &pgm->data[i][j]);   
     } 
    } else { 
     fgetc(pgmfile);// this should eat the last \n 
     for (int i = 0; i < pgm->height; ++i) 
     { 
      pgm->data[i] = (unsigned char*)malloc(pgm->width * sizeof(unsigned char*)); 
      fread(pgm->data[i],sizeof(unsigned char*),pgm->width,pgmfile);//reading line by line 
     } 
    } 
} 

PGMImage은 다음과 같습니다.

typedef struct PGMImage { 
    char magicNumber[2]; 
    unsigned char** data; 
    unsigned int width; 
    unsigned int height; 
    unsigned int maxValue; 
} PGMImage; 

내가 뭘 잘못하고 있니?

pgm->data[i] = (unsigned char*)malloc(pgm->width * sizeof(unsigned char*)); 
fread(pgm->data[i],sizeof(unsigned char*),pgm->width,pgmfile);//reading line by line 

가 있어야한다 :

pgm->data[i] = malloc(pgm->width * sizeof(unsigned char)); 
if(pgm->data[i]==NULL){fprintf(stderr,"malloc failed\n");exit(1);} 
fread(pgm->data[i],sizeof(unsigned char),pgm->width,pgmfile);//reading line by line 

사실, unsigned char* 포인터가 서명 숯불로하고 sizeof(unsigned char*)가의 크기가됩니다 이미지를 읽을

답변

1

잠재적 인 문제가있다 포인터 (8 바이트 가능성). 따라서 이미지를 읽으면 라인을 읽을 때마다 8 개의 행이 읽혀집니다.

+0

와우, 당신은 절대적으로 맞습니다. 젠장 포인터는 까다 롭습니다. 그러나이 픽스가 여전히 작동하지 않아도 이미지는 여전히 시끄 럽습니다. 나는 더 많은 정보를 가지고 나의 포스트를 편집 할 것이다. –

+0

이제 문제는 쉽게 발견되었습니다. 그림에 원래의 매직 넘버를 인쇄하고 있었지만, 읽은 후에 정보는 항상 ASCII 형식으로 인쇄되었으므로 항상 P2 여야합니다. 도와 주셔서 감사합니다! –