#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: