98 Answer ― Half


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