Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字节数组转换为png_Java_Image_Png_Byte_Bufferedimage - Fatal编程技术网

Java 将字节数组转换为png

Java 将字节数组转换为png,java,image,png,byte,bufferedimage,Java,Image,Png,Byte,Bufferedimage,我有一个字节数组,使用下面的代码从一个图像中获得 String path = "/home/mypc/Desktop/Steganography/image.png"; File file = new File(path); BufferedImage bfimage = ImageIO.read(file); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bfimage, "png", baos

我有一个字节数组,使用下面的代码从一个图像中获得

String path = "/home/mypc/Desktop/Steganography/image.png";
File file = new File(path);
BufferedImage bfimage = ImageIO.read(file);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bfimage, "png", baos);
baos.flush();
byte[] img_in_bytes = baos.toByteArray();
baos.close();
BufferedImage final_img = ImageIO.read(new ByteArrayInputStream(img_in_bytes));
File output_file = new File("Stegano2.png");
ImageIO.write(final_img, "png", output_file);
然后,我使用以下代码将这些字节转换回png图像

String path = "/home/mypc/Desktop/Steganography/image.png";
File file = new File(path);
BufferedImage bfimage = ImageIO.read(file);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bfimage, "png", baos);
baos.flush();
byte[] img_in_bytes = baos.toByteArray();
baos.close();
BufferedImage final_img = ImageIO.read(new ByteArrayInputStream(img_in_bytes));
File output_file = new File("Stegano2.png");
ImageIO.write(final_img, "png", output_file);
如果我只执行这段代码,这是非常好的。但是如果我试图修改中间的一些字节,可以这样说:

    Insert_number_to_image(image_in_bytes,  10);
static void Insert_number_to_image(byte[] image, int size){     
    byte[] size_in_byte = new byte[4];
    size_in_byte[0] = (byte)(size >>> 0);
    size_in_byte[1] = (byte)(size >>> 8);
    size_in_byte[2] = (byte)(size >>> 16);
    size_in_byte[3] = (byte)(size >>> 24);

    byte temp;
    int count = 0;

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<8; j++)
        {
            temp = size_in_byte[i];
            temp = (byte)(temp >>> j);
            temp = (byte)(temp & 1);
            if(temp == 1)
            {
                image[count] = (byte)(image[count] | 1);
            }
            else if(temp == 0)
            {
                image[count] = (byte)(image[count] & (byte)(~(1)));
            }
            count++;
        }
    }
}
我的方法“将数字插入图像”是这样的:

    Insert_number_to_image(image_in_bytes,  10);
static void Insert_number_to_image(byte[] image, int size){     
    byte[] size_in_byte = new byte[4];
    size_in_byte[0] = (byte)(size >>> 0);
    size_in_byte[1] = (byte)(size >>> 8);
    size_in_byte[2] = (byte)(size >>> 16);
    size_in_byte[3] = (byte)(size >>> 24);

    byte temp;
    int count = 0;

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<8; j++)
        {
            temp = size_in_byte[i];
            temp = (byte)(temp >>> j);
            temp = (byte)(temp & 1);
            if(temp == 1)
            {
                image[count] = (byte)(image[count] | 1);
            }
            else if(temp == 0)
            {
                image[count] = (byte)(image[count] & (byte)(~(1)));
            }
            count++;
        }
    }
}

您使用的是PNG图像的原始ByTestStream,如果ByTestStream不直接反映任何像素值,甚至更改一个字节都可能会不可逆转地损坏文件

相反,您需要的是使用

byte[] pixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
现在,您可以根据需要修改像素值。准备将其保存回文件时,将像素数组放入
DataBufferByte
对象中,并将其传递给
WriteableRaster
,然后使用该对象创建
buffereImage


您的方法适用于原始ByTestStream直接表示像素的格式,例如。但是,即使这样,您也必须跳过前几个字节以避免损坏标头。

您使用的是PNG图像的原始ByTestStream,如果ByTestStream不直接反映任何像素值,甚至更改一个字节都可能会不可逆转地损坏文件

相反,您需要的是使用

byte[] pixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
现在,您可以根据需要修改像素值。准备将其保存回文件时,将像素数组放入
DataBufferByte
对象中,并将其传递给
WriteableRaster
,然后使用该对象创建
buffereImage

您的方法适用于原始ByTestStream直接表示像素的格式,例如。但是,即使这样,您也必须跳过前几个字节以避免损坏标头