0

我正在使用文件pgm.cpgm.h来读取 PGM 图像文件,然后我的程序将处理该文件(灰度、旋转等)。

但是,我无法正确读取文件。当我使用:

   PGMImage* img = (PGMImage*)malloc(sizeof(PGMImage));
   char iName1[256];
   printf("Enter the filename of your PGM image:\n");
   scanf("%s", iName1);
   getPGMfile(iName1, &img);

控制台返回图像的类型、宽度、高度和最大值。但是,宽度永远不正确。无论我使用的是我在网上找到的 .pgm 文件还是我自己制作的文件,它通常为 0(有一次是 56,距离很远)。我什至尝试对图像的宽度进行硬编码,但即便如此,它也会导致程序崩溃。应该在 pgm.c 中的 getPGMfile 函数下读取宽度:

void getPGMfile (char filename[], PGMImage *img)
 {
   FILE *in_file;
   char ch;
   int row, col, type;
   int ch_int;

   in_file = fopen(filename, "r");
   if (in_file == NULL)
   {
     fprintf(stderr, "Error: Unable to open file %s\n\n", filename);
     exit(8);
   }

   printf("\nReading image file: %s\n", filename);

   /*determine pgm image type (only type three can be used)*/
   ch = getc(in_file);
   if(ch != 'P')
   {
      printf("ERROR(1): Not valid pgm/ppm file type\n");
      exit(1);
   }
   ch = getc(in_file);
   /*convert the one digit integer currently represented as a character to
     an integer(48 == '0')*/
   type = ch - 48;
   printf("Type: %d", type);
   if((type != 2) && (type != 3) && (type != 5) && (type != 6))
   {
      printf("ERROR(2): Not valid pgm/ppm file type\n");
      exit(1);
   }

   while(getc(in_file) != '\n');             /* skip to end of line*/

   while (getc(in_file) == '#')              /* skip comment lines */
   {
     while (getc(in_file) != '\n');          /* skip to end of comment line */
   }

   /*there seems to be a difference between color and b/w.  This line is needed
     by b/w but doesn't effect color reading...*/
   fseek(in_file, -1, SEEK_CUR);             /* backup one character*/

   fscanf(in_file,"%d", &((*img).width));
   fscanf(in_file,"%d", &((*img).height));
   fscanf(in_file,"%d", &((*img).maxVal));

   //I omitted the rest, but it can be seen in the link above

我不知道是什么导致了这些错误。我在 Windows 7(64 位)上使用 Eclipse 和 MinGW GCC。我的导师无法帮助我解决这个问题,所以我希望你能!:)

总结一下:PGM 图像的宽度总是被错误地读取,之后对文件所做的任何事情都会导致可执行文件停止工作。对宽度进行硬编码也会导致可执行文件停止工作。

4

2 回答 2

2

getpgm shouldn't be passed the address of your pointer, but rather just the pointer according to the header file: getPGMfile(iName1, img)

于 2013-07-24T20:21:46.750 回答
0

PGM 格式如下

P5
wid ht
xxx xxx xxx xxx

其中 xxx 是栅格值。getc您需要在读取宽度之前摆脱每个功能,或者ungetc在找不到您要查找的字符时执行。然后,将适当地读取宽度。

于 2013-07-24T20:17:43.037 回答