I39 Answer ― Image Doubling with Smoothing


/* Double Images */
void doubleImageSmooth( image full, image *twice )
{
  int r, c, p, q, u, v ;

  /* construct an image structure of the appropriate size */
  if ( !newImage( twice, full.nrows*2, full.ncols*2 ) )
  {
    printf("doubleImageSmooth(): newImage() failed\n" );
    exit( EXIT_FAILURE );
  }

  /* Deal with most of the image, except last row and last col */
  for ( r=0; r<full.nrows-1; r++ )
    for ( c=0; c<full.ncols-1; c++ )
    {
      p = getPixel( full, r,   c )   ;
      q = getPixel( full, r,   c+1 ) ;
      u = getPixel( full, r+1, c )   ;
      v = getPixel( full, r+1, c+1 ) ;

      setPixel( *twice, r*2,   c*2,   (unsigned char)p );
      setPixel( *twice, r*2,   c*2+1, (unsigned char)((p+q)/2) );
      setPixel( *twice, r*2+1, c*2,   (unsigned char)((p+u)/2) );
      setPixel( *twice, r*2+1, c*2+1, (unsigned char)((p+v)/2) );
    }

  /* Deal with last row */
  r = full.nrows-1;
  for ( c=0; c<full.ncols; c++ )
  {
    p = getPixel( full, r,   c )   ;
    setPixel( *twice, r*2,   c*2,   (unsigned char)p );
    setPixel( *twice, r*2,   c*2+1, (unsigned char)p );
    setPixel( *twice, r*2+1, c*2,   (unsigned char)p );
    setPixel( *twice, r*2+1, c*2+1, (unsigned char)p );
  }

  /* Deal with last col */
  c = full.ncols-1;
  for ( r=0; r<full.nrows-1; r++ )
  {
    p = getPixel( full, r,   c )   ;
    setPixel( *twice, r*2,   c*2,   (unsigned char)p );
    setPixel( *twice, r*2,   c*2+1, (unsigned char)p );
    setPixel( *twice, r*2+1, c*2,   (unsigned char)p );
    setPixel( *twice, r*2+1, c*2+1, (unsigned char)p );
  }

}

Comments: