#include <stdio.h> #include <stdlib.h> #include <math.h> /* Puzzle I06 -- distance image | | */ makeDistance( FILE *image, int nrows, int ncols ) { int r, c, level ; /* row and col of current pixel */ double length, dist ; /* determine the diagonal length */ length = sqrt( (double)(nrows*nrows + ncols*ncols) ); /* write out the pixel data */ for ( r=0; r<nrows; r++ ) { for ( c=0; c<ncols; c++ ) { dist = sqrt( (double)(r*r + c*c) ); level = (int)(255*(1.0-dist/length)); fputc( level, image ); } } } void openImage( char *argv[], FILE **image, int *nrows, int *ncols ) { /* open the image file for writing */ if ( (*image = fopen( argv[1], "wb") ) == NULL ) { printf("file %s could not be created\n", argv[1] ); exit( EXIT_FAILURE ); } *nrows = atoi( argv[2] ); if ( *nrows < 1 ) { printf("number of rows must be positive\n"); exit( EXIT_FAILURE ); } *ncols = atoi( argv[3] ); if ( *nrows < 1 ) { printf("number of columns must be positive\n"); exit( EXIT_FAILURE ); } } int main( int argc, char *argv[] ) { int nrows, ncols ; FILE *image; /* check the command line parameters */ if ( argc != 4 ) { printf("grayDist fileName.pgm nrows ncols\n"); return 0; } /* Open the image file, get number of rows and columns */ openImage( argv, &image, &nrows, &ncols ); /* write out the PGM Header information */ fprintf( image, "P5 "); fprintf( image, "# Created by makeDistance\n"); /* width, height, number of gray levels */ fprintf( image, "%d %d %d ", ncols, nrows, 255 ); /* Create the Image */ makeDistance( image, nrows, ncols ); /* close the file */ fclose ( image ); return 1; }
Comments: The openImage()
function simplifies
main()
.