我正在阅读图像并进行更改.但这些变化并未得到拯救

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"吗?

Dwa*_*ell 5

JPEG是一种有损存储机制.这意味着不需要(甚至不需要)表示与原始字节完全相同的每个字节.事实上,这就是重点,为了节省大量空间,它牺牲了一些小瑕疵.如果你需要字节完美的存储,你必须找到另一种格式,如GIF,PNG或某些BMP.

正如下面所指出的,技术上可以创建一个无损JPEG,但它是一个后期添加,没有完全支持,特别是Java本身不支持它.有关更多信息,请参阅此答案.