将消息存储到图像中

时间:2014-01-20 22:06:30

标签: image embed bufferedimage steganography argb

我试图从一个网站上阅读这一段,但我不明白为什么“第32个像素存储重建创建原始字符串所需的字节值所需的位。”

这是尝试将邮件放入alpha(透明度)(ARGB)

在下面的代码中,为什么需要嵌入整数和字节

 int imageWidth = img.getWidth(), imageHeight = img.getHeight(),
 imageSize = imageWidth * imageHeight;
 if(messageLength * 8 + 32 > imageSize) {
    JOptionPane.showMessageDialog(this, "Message is too long for the chosen image",
       "Message too long!", JOptionPane.ERROR_MESSAGE);
    return;
   }
   embedInteger(img, messageLength, 0, 0);

   byte b[] = mess.getBytes();
   for(int i=0; i<b.length; i++)
      embedByte(img, b[i], i*8+32, 0);
   }

 private void embedInteger(BufferedImage img, int n, int start, int storageBit) {
   int maxX = img.getWidth(), maxY = img.getHeight(), 
      startX = start/maxY, startY = start - startX*maxY, count=0;
   for(int i=startX; i<maxX && count<32; i++) {
      for(int j=startY; j<maxY && count<32; j++) {
         int rgb = img.getRGB(i, j), bit = getBitValue(n, count);
         rgb = setBitValue(rgb, storageBit, bit);
         img.setRGB(i, j, rgb);
         count++;
         }
      }
   }

private void embedByte(BufferedImage img, byte b, int start, int storageBit) {
   int maxX = img.getWidth(), maxY = img.getHeight(), 
      startX = start/maxY, startY = start - startX*maxY, count=0;
   for(int i=startX; i<maxX && count<8; i++) {
      for(int j=startY; j<maxY && count<8; j++) {
         int rgb = img.getRGB(i, j), bit = getBitValue(b, count);
         rgb = setBitValue(rgb, storageBit, bit);
         img.setRGB(i, j, rgb);
         count++;
         }
      }
   }

1 个答案:

答案 0 :(得分:1)

您需要存储消息长度,以便知道要读取多少像素来提取消息。由于无法预测消息的长度,因此分配了32位(前32个像素)。

embedInteger和embedByte函数几乎相似。

  • embedInteger处理在前32个像素中嵌入邮件的长度。
  • embedByte逐个嵌入您的留言字符。每次调用它时,它都会以字节形式b[i]作为输入消息中的下一个字符。在那里,它每像素嵌入一位,每字节总共8位。