1

.bmp と .png で正常に動作している画像を非表示にしようとしていますが、画像を JPG として書き込んで非表示のメッセージを取得しようとすると、機能しません。bmp私の手順では、最初に ( , gif, jpg, png) write messageの形式で画像を読み取り、それを非表示にして保存し、再度それを読み取ってメッセージを抽出できるようにします。で保存すると bmp正常pngに動作しますが、で保存しjpgてメッセージを抽出しようとすると動作しません。

 ImageIO.write(bimg, "png", outputfile);//working
 ImageIO.write(bimg, "png", outputfile);//not working 

JPEG で動作させるにはどうすればよいですか?

注:すべてのピクセルをARGB値の4ビット整数として読み取り、R、G、BのLSBを変更してメッセージを非表示にしています。

    public void stegnography(BufferedImage bimg,String msg,String filename)
    {

      int w=bimg.getWidth();
      int h=bimg.getHeight();
     //*************************************** 
     // String msg="Hide this message:)";
      System.out.println("message="+msg+" length="+msg.length());
    //*************************************** 

      if(msg.length()>255 )
      {
         jLabel3.setText("MESSAGE IS LARGE THAN 255 CHARACTERS");            
      }
      else if( msg.length()*11 >w*h)
      {
         jLabel3.setText("Image is too small");    
      }
      else{

  //-------------------------------------------
           byte[] msgbytes= msg.getBytes();

        int msglendecode= (bimg.getRGB(0,0)>>8)<<8;

         msglendecode |= msg.length();
        bimg.setRGB(0, 0,msglendecode );//hidig msg length at first position

         //System.out.println("\npixel at position (0,0) ");
         // bitpattern(bimg.getRGB(0,0) );

         for(int i=1,msgpos=0,row=0,j=0;   row<h   ;row++  )
      {
          for(int col=0;col<w && j<msgbytes.length ;col++,i++ )
          {      

               if (i%11==0) {

                    int rgb = bimg.getRGB(col,row);


                    int a=((rgb >> 24) & 0xff);

                    int r = (((rgb >> 16) & 0xff)>>3)<<3;
                    r=r|(msgbytes[msgpos]>>5);

                    int g = (((rgb >> 8) & 0xff)>>3)<<3;
                    g=g|((msgbytes[msgpos]>>2)& 7);

                     int b = ((rgb & 0xff)>>2)<<2;
                    b=b|(msgbytes[msgpos]&0x3);


                    rgb=0;
                    rgb=(rgb|(a<<24));
                    rgb=(rgb|(r<<16));
                    rgb=(rgb|(g<<8));

                    rgb=(rgb|b);

                    bimg.setRGB(col,row,rgb);

                    msgpos++;
                    j++;

                  //bitpattern(bimg.getRGB(col,row));

              }


          }//for 2
      }//for 1


      ImageIcon image = new ImageIcon(bimg);
           jLabel3.setIcon(image);  

     try {

  //  File outputfile = new File("c:/Users/yathestha/Documents/"+filename);
     File outputfile = new File("c:/Users/yathestha/Documents/outpng.png");
    ImageIO.write(bimg, "png", outputfile);
} catch (IOException e) {
         System.out.println("error in saving image ");
}

  //-------------------------------------------------
      }//else
 // decoding part----------------------------------------------------------------------   

    }
///////////////////////////////////////////////////////////////////////
private void decodestegnography(BufferedImage bimg) {

     System.out.println("in decode");

   int w=bimg.getWidth(),h=bimg.getHeight();
    bitpattern(bimg.getRGB(0, 0));
    int msglength=(bimg.getRGB(0, 0)&0xff);
    bitpattern(msglength);
    System.out.println("Message Length="+msglength);

    jTextField1.setText("");
      for(int row=0,j=0,i=1;   row<h   ;row++  )
  { 
      for(int col=0;col<w && j<msglength ;col++ ,i++)
      {

          if (i%11==0) {
             int result=bimg.getRGB(col,row);


              int charatpos = (((result >> 16) & 0x7) << 5);

              charatpos |=  (((result >> 8) & 0x7) << 2);

              charatpos |=  ((result & 0x3));

              jTextField1.setText(jTextField1.getText()+ (char)charatpos);

             j++;
          }
      }
  } 

     System.out.println("decoding done");
}//function
4

2 に答える 2

3

jpeg ステガノグラフィの場合は、結果をロスレス jpeg として保存するか、単に別のステガノグラフィ手法を使用してください。私が知っているのは、離散コサイン変換係数 (DCT) をいじっていることだけです。ただし、丸め誤差に注意する必要があるため、シークレットの取得には損失が伴います。

私は DCT を好みませんし、あまり調べたこともありませんが、JPEGロスレス ステガノグラフィを主張する 2007 年の論文を次に示します。このアルゴリズムは、空間ドメインでのカジュアルな LSB 置換よりもはるかに複雑であることに注意してください。周波数ドメインでデータを非表示にすることは、隠蔽能力が低くなることも意味します。これが役立つかどうかはわかりません。興味があり、紙にアクセスできない場合は、非公開で整理できます。

于 2013-05-20T23:53:36.247 に答える
2

100% のエンコード品質を得るには、JPEG を変更する必要がある場合があります。これにより、バイト単位のサイズが大幅に (大幅に) 増加します。

制御可能な圧縮/品質で JPG にエンコードする方法については、このスレッドを参照してください。左側のスライダーは、レベルを制御するために使用されます。

于 2013-05-20T12:01:18.053 に答える