Figure 4: Source code to "unhide" a message image from a cover image

/* This routine pulls the message image out of the cover image
   (the opposite of the cover_image routine) */

int uncover_image(cover_image_name,
                  message_image_name,
                  cover_image,
                  message_image,
                  mlength,
                  mwidth,
                  clength,
                  cwidth,
                  lsb,
                  n)
   char  cover_image_name[],
         message_image_name[];
   int   lsb, n;
   long  clength, cwidth, mlength, mwidth;
   short **cover_image, 
         **message_image;
{
   int h_counter;

   bread_tiff_image(cover_image_name, cover_image);

   for(h_counter=0; h_counter<mwidth; h_counter++){
      uncover_pixels(cover_image, 
                     message_image,
                     h_counter,
                     h_counter*n,
                     lsb,
                     n,
                     mlength);
   }  /* ends loop over h_counter */

   bwrite_tiff_image(message_image_name, message_image);

}  /* ends uncover_image */

/* This routine pulls the eight bits that make up a pixel in the
   message image out of the LSB of the eight pixels in the cover
   image. It is the opposite of the cover_pixels routine. */

int uncover_pixels(cover_image, 
                message_image,
                mie, 
                cie,
                lsb,
                n,
                mlength)
   int   cie, lsb, mie, n;
   long  mlength;
   short **cover_image, 
         **message_image;
{
   char result,
        new_message,
        sample;

   char mask1[EIGHT] =  
                        {0x80,  /* 1000 0000 */
                         0x40,  /* 0100 0000 */
                         0x20,  /* 0010 0000 */
                         0x10,  /* 0001 0000 */
                         0x08,  /* 0000 1000 */
                         0x04,  /* 0000 0100 */
                         0x02,  /* 0000 0010 */
                         0x01}; /* 0000 0001 */

   int c, c_counter, i, j;

   /* If a pixel in the cover image is odd, its lsb has been set,
      so the corresponding bit in the message image should be
      set */

   for(i=0; i<mlength; i++){
      c = n-1;
      new_message = 0x00;
      for(j=0; j<n; j++){
         if(is_odd(cover_image[i][cie+j])){
            /* set bit c */
            if(lsb)
               new_message = new_message | mask1[j];
            else
               new_message = new_message | mask1[c];
         }  /* ends if is_odd */
         c--;
      }  /* ends loop over j */
      message_image[i][mie] = new_message;
   }  /* ends loop over i */
}  /* ends uncover_pixels */

/* is_odd returns 1 if argument is odd, 0 if even */

int is_odd(number)
   short number;
{
   int result = 0;
   result     = number % 2;
   return(result);
}  /* ends is_odd */


/* End of File */