【发布时间】:2014-10-23 02:57:31
【问题描述】:
我正在尝试实施隐写术。 我正在读取图像“a.jpeg”并通过在从偏移量 50 开始的最低有效位更改其连续 7 个字节来在其中插入一个字节。 这是成功完成的,因为当我打印字节时,最后一位会相应地更改。 然后我将它保存为“ao.jpeg”。但是当我从 50 读取字节值时,它们与我保存的一次不同。 这是我的代码
public static void main(String[] args) throws IOException {
BufferedImage inputImage = ImageIO.read(new File("a.jpeg"));
int offset=50;
byte data = 7;
byte[] image = get_byte_data(inputImage);//function converts bufferedimage to byte array
//add data at end of each byte starting from offset
System.out.println("bytes altered are :");
for(int bit=7; bit>=0; --bit, ++offset)//for each bit of data
{
int b = (data >>> bit) & 1;
image[offset] = (byte)((image[offset] & 0xFE) | b );
String s1 = String.format("%8s", Integer.toBinaryString(image[offset] & 0xFF)).replace(' ', '0');
System.out.println(s1);
}
//write changed image to ao.jpeg
BufferedImage outputImage = ImageIO.read(new ByteArrayInputStream(image));
File outputfile = new File("ao.jpeg");
ImageIO.write(outputImage,"jpeg",outputfile);
//read data from ao.jpeg
System.out.println("bytes from encoded image are :");
byte result=0;
offset=50;
BufferedImage oImage = ImageIO.read(new File("aoc.jpeg"));
byte[] image1 = get_byte_data(oImage);//function converts bufferedimage to byte array
for(int i=0; i<8; i++, ++offset)
{
result = (byte)((result << 1) | (image1[offset] & 1));
String s1 = String.format("%8s", Integer.toBinaryString(image1[offset] & 0xFF)).replace(' ', '0');
System.out.println(s1);
}
System.out.println("recovered data is :");
System.out.print(result);
}
输出样本: 插入的数据是 7。如果您注意到每个字节的最低有效位,它正在形成 7。 但是当我再次阅读时,它是随机字节。
bytes altered are :
00010100
00011100
00011010
00011110
00011110
00011101
00011011
00011101
bytes from encoded image are :
00011110
00011101
00011010
00011100
00011100
00100000
00100100
00101110
recovered data is :
64
正如 Konstantin V. Salikhov 所建议的那样,我尝试了不同的文件格式 (gif) 并且成功了。 但是有什么办法可以使用“jpeg”吗?
【问题讨论】:
-
可能是因为 JPEG 有损压缩?
-
我会尝试其他格式并发布结果
-
你有什么建议吗??
-
更改更重要的位。 JPEG 的基本原则是不完全保留最低位信息,这就是它“压缩”得如此出色的原因。
-
出于同样的原因,更改更重要的位将不起作用。 Jpeg 压缩有效地改变了一个像素的值,有时是 1。那么如果你有 00011111 并且它被更改为 00100000 怎么办?您丢失了在第 5 个 LSB 中编码的信息。
标签: java arrays byte bufferedimage steganography