2016-09-24 12 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; 

私は間違っていますか?

答えて

1

あなたが画像を読み取ると潜在的な問題があります:

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*はunsigned char型へのポインタで、sizeof(unsigned char*)は、Aのサイズになりますポインタ(おそらく8バイト)。したがって、イメージが読み取られ、行を読み取るたびに8行が読み込まれます。

+0

うわー、あなたは絶対に正しいです。くそー、ポインタはやっかいです。しかし、この修正でもまだ動作しません、イメージはまだ騒々しいです。私はいくつかの情報で自分の投稿を編集します。 –

+0

さて、問題は簡単に見つかりました。私は写真にオリジナルのマジックナンバーを印刷していましたが、読み込み後の情報は常にASCII形式で表示されていたので、常にP2にしてください。お手伝いありがとう! –