隐藏JPG图像中的消息

我试图隐藏一个图像,它与.bmp和.png一起正常工作但是当我将图像写为JPG并尝试检索隐藏的消息时它无法正常工作。 我的程序,首先读取格式化的图像( bmpgifjpgpng )写入消息以隐藏并保存它,以便我们可以再次读取它并提取消息。 当我用bmppng保存它时它工作正常但是当用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> 24) & 0xff); int r = (((rgb >> 16) & 0xff)>>3)<>5); int g = (((rgb >> 8) & 0xff)>>3)<>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> 16) & 0x7) <> 8) & 0x7) << 2); charatpos |= ((result & 0x3)); jTextField1.setText(jTextField1.getText()+ (char)charatpos); j++; } } } System.out.println("decoding done"); }//function 

对于jpeg隐写术,要么将结果保存为无损jpeg,要么只使用不同的stegographic方法。 我所知道的唯一一个是摆弄离散余弦变换系数(DCT)。 但是,您需要注意舍入错误,因此检索您的秘密将是有损的。

我不喜欢DCT而且我没有深入研究它,但这是2007年的一篇论文,声称jpeg无损隐写术。 请注意,该算法比空间域中的偶然LSB替换要复杂得多。 隐藏频域中的数据也意味着更低的隐藏容量,我不知道这是否会为您服务。 如果您感兴趣并且无法访问该论文,我们可以私下对其进行排序。

您可能必须更改JPEG以获得100%的编码质量 – 这将显着增加字节大小(很多)。

请参阅此主题 ,了解如何使用可控压缩/质量对JPG进行编码。 左侧的滑块用于控制级别。