I27 Answer ― Image Reader


#include <stdlib.h>
#include <stdio.h>
#include "basicImage.c"  /* Use the version that does not include readPGMimage() */

void readPGMimage( image *img, char *filename )
{
  FILE *file;
  char  buffer[1024];
  int   nrows, ncols, ngray ;
  
  /* open the image file for reading binary */
  if ( (file = fopen( filename, "rb") ) == NULL )
  {
    printf("readImage(): file %s could not be opened\n", filename );
    exit( EXIT_FAILURE );
  }

  /* read signature on first line */
  if ( fscanf( file, "%s", buffer ) != 1 )
  {
    printf("error in image header: no signature\n" );
    exit( EXIT_FAILURE );
  }

  if ( strncmp( buffer, "P5", 2 ) != 0 )
  {
    printf("readPGMimage(): file %s is not a PGM file\n", filename );
    printf("Signature: %s\n", buffer );
    exit( EXIT_FAILURE );
  }

  /* skip over comment lines */
  int moreComments = 1, ch;
  while ( moreComments )
  {
    /* skip over possible white space */
    while ( (ch=fgetc(file)) && isspace(ch) );
    if ( ch=='#' )
    {
      /* comments are required to end with line-feed */
      fgets( buffer, 1024, file );
    }
    else
    {
      moreComments = 0;
      ungetc( ch, file );
    }
  }

  /* get ncols, nrows, ngray and eat rhe required single white space */
  int count = fscanf( file, "%d %d %d", &ncols, &nrows, &ngray );
  if ( count != 3 )
  {
    printf("error in image header\n" );
    exit( EXIT_FAILURE );
  }
  fgetc(file);

  if ( ngray != 255 )
  {
    printf("readPGMimage(): file %s is %d, not 8 bits per pixel\n",
      filename, ngray );
    exit( EXIT_FAILURE );
  }

  /* construct an image structure of the appropriate size */
  if ( !newImage( img, nrows, ncols ) )
  {
    printf("readPGMimage(): newImage failed\n" );
    exit( EXIT_FAILURE );
  }

  /* read the pixel data */
  fread( img->pixels, 1, img->nrows*img->ncols, file );

  /* close the file */
  fclose( file );
}

int main ( int argc, char* argv[] )
{
  image img ;
  
  if ( argc != 3 )
  {
    printf("copyImage oldImage newImage\n");
    system( "pause" );
    exit( EXIT_FAILURE );
  }
  
  /* read in the old image */
  readPGMimage( &img, argv[1]);

  /* write the image to disk and free memory */
  writePGMimage( img, argv[2]);
  freeImage( &img );
  system( "pause" );
}

Comments: