Figure 1: Source code to hide a watermark in an image

/* file bhidet.c */

#include "cips.h"

main(argc, argv)
   int argc;
   char *argv[];
{
   char  image_name[80], water_name[80];
   int   i, j;
   short factor;
   short **the_image, **out_image;
   struct   tiff_header_struct image_header1;
   struct   tiff_header_struct image_header2;

   ...

   /* code to interpret the command line - not shown */

   ...
   

   read_tiff_header(image_name, &image_header1);
   read_tiff_header(water_name, &image_header2);

   ...

   /* code to check that the two images are the same size -
      not shown */

   ...
   
   /* Allocate the two image arrays. */

   the_image =
      malloc(image_header1.image_length * sizeof(short  *));
   for(i=0; i<image_header1.image_length; i++){
      the_image[i] =
         malloc(image_header1.image_width * sizeof(short ));
      if(the_image[i] == '\0'){
         printf("\n\tmalloc of the_image[%d] failed", i);
         exit(0);
      }  /* ends if */
   }  /* ends loop over i */

   out_image =
      malloc(image_header2.image_length * sizeof(short  *));
   for(i=0; i<image_header2.image_length; i++){
      out_image[i] =
         malloc(image_header2.image_width * sizeof(short ));
      if(out_image[i] == '\0'){
         printf("\n\tmalloc of out_image[%d] failed", i);
         exit(0);
      }  /* ends if */
   }  /* ends loop over i */


   /* Read the images; add the factor to the image per the
      watermark image; write the resulting image */

   bread_tiff_image(image_name, the_image);
   bread_tiff_image(water_name, out_image);

   for(i=0; i<image_header1.image_length; i++){
      for(j=0; j<image_header1.image_width; j++){
         if(out_image[i][j] != 0){
            the_image[i][j] = the_image[i][j] + factor;
            if(the_image[i][j] > GRAY_LEVELS)
               the_image[i][j] = GRAY_LEVELS;
         }  /* ends if */

      } /* ends loop over j */
   }  /* ends loop over i */

   bwrite_tiff_image(image_name, the_image);

   free_image_array(the_image, image_header1.image_length);
   free_image_array(out_image, image_header2.image_length);

}  /* ends main  */


...

    /***********************************************
    *
    *  file bsub.c
    *
    *************************************************/

#include "cips.h"

main(argc, argv)
   int argc;
   char *argv[];
{
   char  min_name[80], sub_name[80];
   int   i, j;
   short **the_image, **out_image;
   struct   tiff_header_struct image_header1;
   struct   tiff_header_struct image_header2;

   ...
   
   /* code to read interpret the command line - not shown */

   ...

   read_tiff_header(min_name, &image_header1); /* minuend image */
   read_tiff_header(sub_name, &image_header2); /* subtrahend */

   ...

   /* code to ensure image files are same size - not shown */

   ...

   /*  Allocate the two image arrays. */

   the_image =
      malloc(image_header1.image_length * sizeof(short  *));
   for(i=0; i<image_header1.image_length; i++){
      the_image[i] =
         malloc(image_header1.image_width * sizeof(short ));
      if(the_image[i] == '\0'){
         printf("\n\tmalloc of the_image[%d] failed", i);
         exit(0);
      }  /* ends if */
   }  /* ends loop over i */

   out_image =
      malloc(image_header2.image_length * sizeof(short  *));
   for(i=0; i<image_header2.image_length; i++){
      out_image[i] =
         malloc(image_header2.image_width * sizeof(short ));
      if(out_image[i] == '\0'){
         printf("\n\tmalloc of out_image[%d] failed", i);
         exit(0);
      }  /* ends if */
   }  /* ends loop over i */

   /* Read the images; subtract one image from the other; write the
      resulting image */

   bread_tiff_image(min_name, the_image);
   bread_tiff_image(sub_name, out_image);

   for(i=0; i<image_header1.image_length; i++){
      for(j=0; j<image_header1.image_width; j++){
         the_image[i][j] = the_image[i][j] - out_image[i][j];
         if(the_image[i][j] < 0)
            the_image[i][j] = 0;
      } /* ends loop over j */
   }  /* ends loop over i */

   bwrite_tiff_image(min_name, the_image);

   free_image_array(the_image, image_header1.image_length);
   free_image_array(out_image, image_header2.image_length);

}  /* ends main  */


/* End of File */