⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stega.c

📁 This is code tutorial for image processing include:histogram,sketon....
💻 C
字号:

    /***********************************************
    *
    *  file stega.c
    *
    *  Functions: This file contains
    *     main
    *     hide_image
    *     hide_pixels
    *     uncover_image
    *     uncover_pixels
    *
    *  Purpose:
    *     This file contains the main calling
    *     routine and other routines that
    *     use steganography to hide one image
    *     inside another and then recover the
    *     hidden image.
    *
    *  External Calls:
    *      imageio.c - create_image_file
    *                  read_image_array
    *                  write_image_array
    *                  get_image_size
    *                  allocate_image_array
    *                  free_image_array
    *
    *  Modifications:
    *     5 April 1998 - created
    *     22 September 1998 - modified to work with 
    *           all I O routines in imageio.c.
    *
    *************************************************/

#include "cips.h"
#define EIGHT 8



main(argc, argv)
   int argc;
   char *argv[];
{

   char  cover_image_name[80], 
         message_image_name[80];
   int   hide    = 0,
         i, 
         j, 
         lsb,
         n,
         uncover = 0;

   long  clength, 
         mlength, 
         cwidth,
         mwidth;

   short **the_image;
   short **out_image;

      /******************************************
      *
      *   Ensure the command line is correct.
      *
      ******************************************/

   if(argc < 5){
      stega_show_usage();
      exit(0);
   }

   if(strcmp(argv[1], "-h") == 0){
      hide    = 1;
      uncover = 0;
   }
   if(strcmp(argv[1], "-u") == 0){
      hide    = 0;
      uncover = 1;
   }
   if(  (hide    == 0)   &&
        (uncover == 0)  ){
      printf("\nNiether hiding nor uncovering");
      printf("\nSo, quitting");
      exit(1);
   }  /* ends if */

   strcpy(cover_image_name, argv[2]);
   strcpy(message_image_name, argv[3]);
   n = atoi(argv[4]);


      /******************************************
      *
      * Hide the cover image in the message image.
      *
      ******************************************/


   if(hide){
      if(does_not_exist(cover_image_name)){
         printf("\n%s does not exist, quitting", 
         cover_image_name);
      }
      if(does_not_exist(message_image_name)){
         printf("\n%s does not exist, quitting", 
         message_image_name);
      }

         /******************************************
         *
         *   Ensure both images have the same height
         *   and the cover image is eight times as
         *   wide as the message image.
         *   Also determine if the bit order is lsb
         *   first or not.
         *
         ******************************************/

      get_image_size(cover_image_name, 
                     &clength, &cwidth);
      get_image_size(message_image_name, 
                     &mlength, &mwidth);
      
      if(mlength != clength){
         printf("\n\nmlength NOT EQUAL TO clength");
         printf("\nQUITING");
         exit(2);
      }  /* ends if length not equal */

      if(cwidth != (n*mwidth)){
         printf("\nCover image not wide enough");
         printf("\nQUITING");
         exit(3);
      }  /* ends if cover image not wide enough */

      lsb = get_lsb(cover_image_name);

         /******************************************
         *
         *   Allocate the two image arrays.
         *   Read the cover and message images and
         *   hide the message image.
         *
         ******************************************/

      the_image = allocate_image_array(
                     clength, cwidth);
      out_image = allocate_image_array(
                     mlength, mwidth);
      read_image_array(cover_image_name, the_image);
      read_image_array(message_image_name, out_image);

      hide_image(the_image, out_image,
                 mlength, mwidth,
                 clength, cwidth,
                 lsb, n);
      write_image_array(cover_image_name, the_image);
   }  /* ends if hide */



      /******************************************
      *
      *   Uncover the cover image from the 
      *   message image.
      *
      ******************************************/

   if(uncover){
printf("\nMAIN> Uncover");

      if(does_not_exist(cover_image_name)){
         printf("\n%s does not exist, quitting", 
         cover_image_name);
      }  /* ends if does_not_exist */

         /******************************************
         *
         *   Create the message image to be the
         *   correct size.
         *
         ******************************************/

      get_image_size(cover_image_name, 
                     &clength, &cwidth);
      mlength = clength;
      mwidth  = cwidth/n;
      create_resized_image_file(cover_image_name,
                                message_image_name, 
                                mlength, mwidth); 
      lsb = get_lsb(cover_image_name);

         /******************************************
         *
         *   Allocate the two image arrays.
         *   Read the cover image and uncover
         *   the message image.
         *
         ******************************************/

      the_image = allocate_image_array(
                     clength, cwidth);
      out_image = allocate_image_array(
                     mlength, mwidth);
      read_image_array(cover_image_name, the_image);
      uncover_image(the_image, out_image,
                    mlength, mwidth,
                    clength, cwidth,
                    lsb, n);
      write_image_array(message_image_name, out_image);

   }  /* ends if uncover */


   free_image_array(the_image, clength);
   free_image_array(out_image, mlength);

}  /* ends main  */



   /*********************************************
   *
   *   hide_image(...
   *
   *   This routine hides the message image in
   *   the cover image.  Loop through the pixels
   *   in the message image and call hide_pixels
   *   for every pixel in the message image.
   *
   *********************************************/


int hide_image(cover_image,
               message_image,
               mlength,
               mwidth,
               clength,
               cwidth,
               lsb,
               n)
   int   lsb, n;
   long  clength, cwidth, mlength, mwidth;
   short **cover_image, 
         **message_image;
{
   char response[80];
   int h_counter        = 0;


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

}  /* ends hide_image */




   /*********************************************
   *
   *   hide_pixels(..
   *
   *   This routine hides the bits in a pixel
   *   from the message image into the least
   *   significant bit of eight pixels in the
   *   cover image.
   *
   *   Do this one operation for every row of
   *   pixels in the message and cover images.
   *
   *********************************************/

int hide_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] =  {0x01,  /* 0000 0001 */
                         0x02,  /* 0000 0010 */
                         0x04,  /* 0000 0100 */
                         0x08,  /* 0000 1000 */
                         0x10,  /* 0001 0000 */
                         0x20,  /* 0010 0000 */
                         0x40,  /* 0100 0000 */
                         0x80}; /* 1000 0000 */


   char mask2[EIGHT] = {0xFE,  /* 1111 1110 */
                        0xFD,  /* 1111 1101 */
                        0xFB,  /* 1111 1011 */
                        0xF7,  /* 1111 0111 */
                        0xEF,  /* 1110 1111 */
                        0xDF,  /* 1101 1111 */
                        0xBF,  /* 1011 1111 */
                        0x7F}; /* 0111 1111 */


   int c_counter,
       i, j;

printf("\nHP> mie=%d   cie=%d   lsb=%d", mie, cie, lsb);

   for(i=0; i<mlength; i++){
      c_counter = 0;
      sample    = message_image[i][mie];

      for(j=n-1; j>-1; j--){

         /***********************************
         *
         *   Find out if the jth bit is 
         *   a 1 or 0.  If it is non-zero,
         *   set the LSB of the message image's
         *   pixel.  Else, clear that LSB.
         *
         ***********************************/

         new_message = cover_image[i][cie+c_counter];
         result      = sample & mask1[j];

         if(result != 0x00){ /* set lsb */
            if(lsb)
               new_message = new_message | mask1[0];
            else
               new_message = new_message | mask1[EIGHT];
         } /* ends if set lsb */

         else{ /* clear lsb */
            if(lsb)
               new_message = new_message & mask2[0];
            else
               new_message = new_message & mask2[EIGHT];
         }  /* ends if clear lsb */

         cover_image[i][cie+c_counter] = new_message;
         c_counter++;

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



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

int uncover_image(cover_image,
                  message_image,
                  mlength,
                  mwidth,
                  clength,
                  cwidth,
                  lsb,
                  n)
   int   lsb, n;
   long  clength, cwidth, mlength, mwidth;
   short **cover_image, 
         **message_image;
{
   int h_counter;

   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 */

}  /* ends uncover_image */



   /*********************************************
   *
   *   uncover_pixels(...
   *
   *   This routine pulls the eight bits that
   *   make up a pixel in the message image
   *   out of the LSB of 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 */
   char mask2[EIGHT] = 
                       {0x7F,  /* 0111 1111 */
                        0xBF,  /* 1011 1111 */
                        0xDF,  /* 1101 1111 */
                        0xEF,  /* 1110 1111 */
                        0xF7,  /* 1111 0111 */
                        0xFB,  /* 1111 1011 */
                        0xFD,  /* 1111 1101 */
                        0xFE}; /* 1111 1110 */

   int c, c_counter, i, j;
printf("\nUP> mie=%d   cie=%d   lsb=%d", 
mie, cie, lsb);

      /*************************************
      *
      *  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(...
   *
   *   This routine determines if a short is 
   *   an odd number.  If it is, this routine
   *   returns a 1, else it returns a 0.
   *
   *********************************************/

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


stega_show_usage()
{
printf("\n\nNot enough parameters:");
printf("\n");
printf("   "
"\nstega -h cover-image-name message-image-name n"
"\n       to hide the message image in the cover image"
"\n                 or"
"\nstega -u cover-image-name message-image-name n"
"\n       to uncover the cover image from "
"the message image");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -