Hit*_*wal 1 java arrays byte bufferedimage steganography
我正在尝试实施隐写术.我正在读取一个图像"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);
}
Run Code Online (Sandbox Code Playgroud)
输出样本:插入的数据是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
Run Code Online (Sandbox Code Playgroud)
正如Konstantin V. Salikhov所建议的那样,我尝试了不同的文件格式(gif)并且它有效.但有什么办法可以使用"jpeg"吗?