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*)
가의 크기가됩니다 이미지를 읽을
와우, 당신은 절대적으로 맞습니다. 젠장 포인터는 까다 롭습니다. 그러나이 픽스가 여전히 작동하지 않아도 이미지는 여전히 시끄 럽습니다. 나는 더 많은 정보를 가지고 나의 포스트를 편집 할 것이다. –
이제 문제는 쉽게 발견되었습니다. 그림에 원래의 매직 넘버를 인쇄하고 있었지만, 읽은 후에 정보는 항상 ASCII 형식으로 인쇄되었으므로 항상 P2 여야합니다. 도와 주셔서 감사합니다! –