I02 Answer


#include <stdio.h>
#include <stdlib.h>

/* Puzzle I02 -- create an image file with all pixels the same level
|
|  The name of the file, the number of rows and number of columns,
|  and the gray level are specified on the command line.
|
|  This version does the image creation in a function.
|
*/

void writePixels( FILE *image, int nrows,
                  int ncols, int grayLevel )
{
  int r, c;

  /* all pixels are the same graylevel */
  for ( r=0; r<nrows; r++ )
    for ( c=0; c<ncols; c++ )
      fputc( grayLevel, image );
}

int main(int argc, char *argv[])
{
  int  nrows, ncols, grayLevel;
  FILE *image;

  /* check the command line parameters */
  if ( argc != 5 )
  {
    printf("makeGray fileName.pgm nrows ncols grayLevel\n");
    return 0;
  }

  nrows = atoi( argv[2] );
  if ( nrows < 1 )
  {
    printf("number of rows must be positive\n");
    return 0;
  }

  ncols = atoi( argv[3] );
  if ( nrows < 1 )
  {
    printf("number of columns must be positive\n");
    return 0;
  }

  grayLevel = atoi( argv[4] );
  if ( !(grayLevel >= 0 && grayLevel <=255) )
  {
    printf("grayLevel must be between 0 and 255\n");
    return 0;
  }

  /* open the image file for writing */
  if ( (image = fopen( argv[1], "wb") ) == NULL )
  {
    printf("file %s could not be created\n", argv[1]);
    return 0;
  }

  /* write out the PGM Header information */
  fprintf( image, "P5 ");
  fprintf( image, "# Created by makeGray\n");
  fprintf( image, "%d %d %d ", ncols, nrows, 255 );

  /* Write out all the pixels */
  writePixels( image, nrows, ncols, grayLevel );

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

  return 1;
}

Comments:

1. Study how the function definition:

void writePixels( FILE *image, int nrows,
                  int ncols, int grayLevel )

and the function call

  writePixels( image, nrows, ncols, grayLevel );
 

are coordinated.

2. In refactoring the program, you might have decided to put the code that writes the image header into the function. This would have been OK.


back