#include <stdlib.h> #include <stdio.h> #include "../basicColorImage.c" pixel avgPix( pixel a, pixel b ) { pixel avg ; avg.red = (a.red+b.red)/2; avg.grn = (a.grn+b.grn)/2; avg.blu = (a.blu+b.blu)/2; return avg; } void doubleSize( colorImage original, colorImage twice ) { int r, c ; pixel pixUL, pixUR, pixLL, pixLR; for ( r=0; r<original.nrows-1; r++ ) for ( c=0; c<original.ncols-1; c++ ) { pixUL = getColorPixel( original, r, c ) ; pixUR = getColorPixel( original, r, c+1 ) ; pixLL = getColorPixel( original, r+1, c ) ; pixLR = getColorPixel( original, r+1, c+1 ) ; setColorPixel( twice, 2*r, 2*c, pixUL ); setColorPixel( twice, 2*r, 2*c+1, avgPix(pixUL,pixUR) ); setColorPixel( twice, 2*r+1, 2*c, avgPix(pixUL,pixLL) ); setColorPixel( twice, 2*r+1, 2*c+1, avgPix(pixUL,pixLR) ); } /* right edge */ c = original.ncols-1; for ( r=0; r<original.nrows-1; r++ ) { pixUL = getColorPixel( original, r, c ) ; pixLL = getColorPixel( original, r+1, c ) ; setColorPixel( twice, 2*r, 2*c, pixUL ); setColorPixel( twice, 2*r, 2*c+1, pixUL); setColorPixel( twice, 2*r+1, 2*c, avgPix(pixUL,pixLL) ); setColorPixel( twice, 2*r+1, 2*c+1, avgPix(pixUL,pixLL) ); } /* bottom edge */ r = original.nrows-1; for ( c=0; c<original.ncols-1; c++ ) { pixUL = getColorPixel( original, r, c ) ; pixUR = getColorPixel( original, r, c+1 ) ; setColorPixel( twice, 2*r, 2*c, pixUL ); setColorPixel( twice, 2*r, 2*c+1, avgPix(pixUL,pixUR) ); setColorPixel( twice, 2*r+1, 2*c, pixUL ); setColorPixel( twice, 2*r+1, 2*c+1, avgPix(pixUL,pixUR) ); } /* bottom right block */ r = original.nrows-1; c = original.ncols-1; pixUL = getColorPixel( original, r, c ) ; setColorPixel( twice, 2*r, 2*c, pixUL ); setColorPixel( twice, 2*r, 2*c+1, pixUL ); setColorPixel( twice, 2*r+1, 2*c, pixUL ); setColorPixel( twice, 2*r+1, 2*c+1, pixUL ); } int main ( int argc, char* argv[] ) { colorImage original; colorImage twice; if ( argc != 3 ) { printf("colorToDouble original.ppm doubleSize.ppm\n"); exit( EXIT_FAILURE ); } /* read in the old image */ readPPMimage( &original, argv[1] ); /* create empty color image */ if ( newColorImage( &twice, original.nrows*2, original.ncols*2 ) == NULL ) { printf(">>error<< newColorImage can't allocate memory\n"); exit( EXIT_FAILURE ); } /* fill in double size image */ doubleSize( original, twice ) ; /* write the image to disk and free memory */ writePPMimage( twice, argv[2] ); freeColorImage( &original ); freeColorImage( &twice ); }
Comments: