在Java中,将File.bmp转换为二进制文件,并将二进制文件转换回File.bmp

在Java中,将File.bmp转换为二进制文件,并将二进制文件转换回File.bmp,java,bitmap,binary,Java,Bitmap,Binary,我正在尝试将图像(.bmp)转换为二进制代码,然后对其进行处理并将其转换回。让我们把处理部分撇开,只关注转换 我现在设法将图像转换为二进制: // Image to byte[] File file = new File("image.bmp"); BufferedImage bufferedImage = ImageIO.read(file); WritableRaster raster = bufferedImage.getRaster()

我正在尝试将图像(.bmp)转换为二进制代码,然后对其进行处理并将其转换回。让我们把处理部分撇开,只关注转换

我现在设法将图像转换为二进制:

    // Image to byte[]
    File file = new File("image.bmp");
    BufferedImage bufferedImage = ImageIO.read(file);
    WritableRaster raster = bufferedImage.getRaster();
    DataBufferByte data = (DataBufferByte) raster.getDataBuffer();

   // byte[] to binary String
   String string = "";
    for (byte b : data.getData()) {
        String substring = Integer.toBinaryString((b & 0xFF) + 0x100).substring(1);
        string = string.concat(substring);
    }

  // Binary string to binary LinkedList<Ingeger> - this part is optional
  LinkedList<Integer> vector = new LinkedList<>();
    for (char c : stringVector.toCharArray()) {
        if (c == '0' || c == '1') {
            vector.add((int) c - 48);

        } else {
            System.out.println("Incorrect value.");
            break;
        }
    }

有人能帮我弄清楚吗?因为我不确定这到底是怎么回事。如果您有任何建议,我将不胜感激。

因此,经过大量研究,终于找到了解决方案

要将.bmp格式的BuffereImage转换为二进制:

public String imageToVector(BufferedImage image) throws Exception {
        String vectorInString = "";
        for (int x = 0; x < image.getWidth(); x++) {
            for (int y = 0; y < image.getHeight(); y++) {
                Color color = new Color(image.getRGB(x, y), false);
            vectorInString = vectorInString.concat(decimalToBinary(color.getRed()));
            vectorInString = vectorInString.concat(decimalToBinary(color.getGreen())); 
            vectorInString = vectorInString.concat(decimalToBinary(color.getBlue())); 
            }
        }
        return vectorInString;
}
公共字符串imageToVector(BuffereImage图像)引发异常{
字符串向量安装=”;
对于(int x=0;x
要将二进制向量转换回.bmp格式的BuffereImage,请执行以下操作:

 String[] splittedString = vectorInString.split("(?<=\\G.{8})");

    int i = 0;
    for (int x = 0; x < image.getWidth(); x++) {
        for (int y = 0; y < image.getHeight(); y++) {
            int red = Integer.parseInt(splittedString[i], 2); 
            i++;
            int green = Integer.parseInt(splittedString[i], 2); 
            i++;
            int blue = Integer.parseInt(splittedString[i], 2); 
            i++;

            Color color = new Color(red, green, blue);

            image.setRGB(x, y, color.getRGB());
        }
    }

String[]splittedString=vectoristring.split((?所以经过大量研究,终于找到了解决方案

要将.bmp格式的BuffereImage转换为二进制:

public String imageToVector(BufferedImage image) throws Exception {
        String vectorInString = "";
        for (int x = 0; x < image.getWidth(); x++) {
            for (int y = 0; y < image.getHeight(); y++) {
                Color color = new Color(image.getRGB(x, y), false);
            vectorInString = vectorInString.concat(decimalToBinary(color.getRed()));
            vectorInString = vectorInString.concat(decimalToBinary(color.getGreen())); 
            vectorInString = vectorInString.concat(decimalToBinary(color.getBlue())); 
            }
        }
        return vectorInString;
}
公共字符串imageToVector(BuffereImage图像)引发异常{
字符串向量安装=”;
对于(int x=0;x
要将二进制向量转换回.bmp格式的BuffereImage,请执行以下操作:

 String[] splittedString = vectorInString.split("(?<=\\G.{8})");

    int i = 0;
    for (int x = 0; x < image.getWidth(); x++) {
        for (int y = 0; y < image.getHeight(); y++) {
            int red = Integer.parseInt(splittedString[i], 2); 
            i++;
            int green = Integer.parseInt(splittedString[i], 2); 
            i++;
            int blue = Integer.parseInt(splittedString[i], 2); 
            i++;

            Color color = new Color(red, green, blue);

            image.setRGB(x, y, color.getRGB());
        }
    }

String[]splittedString=vectoristring.split(“(?BMP文件不仅仅是所有的图像数据,这是您从光栅中获得的所有数据;它至少还有一个标题。因此生成的
output.BMP
不会是BMP文件。除此之外,您所做的工作非常混乱。我无法想象您为什么要将图像数据作为所有数据的
链接列表来处理他在光栅中插入了位。我强烈怀疑这是一个x-y问题,你最好解释一下你到底在做什么。我已经说过的
LinkedList
部分是可选的。我只是更容易使用它(编码、通过通道、解码)。我将对图像执行相同的操作,这就是为什么我需要将其作为二进制文件,这就是为什么我需要将其从二进制文件转换回.bmp(处理后).但在这个线程中,我只是专注于从.bmp转换成二进制再转换回来,我有点卡住了。你到底为什么要把它转换成字符串呢?还要使用Schlemiel-the-Painter算法?而且,嗯,如果你没有注意到……bmp是二进制的,并且假设它是未压缩的,那么它不是“编码的”一点也不。你到底想用这些来完成什么?@nyrguds是的,我做错了,现在我发布了一个对我来说非常有效的解决方案。也许这不是最好的,但它确实对我有效。我花了一些时间在这方面,请仔细检查:)BMP文件不仅仅是所有的图像数据,这是您从光栅中获得的所有数据;它至少还有一个标题。因此生成的
output.BMP
不会是BMP文件。除此之外,您所做的工作非常混乱。我无法想象您为什么要将图像数据作为所有数据的
LinkedList
光栅中的位。我强烈怀疑这是一个x-y问题,您最好解释一下您实际要做的事情。我前面提到的
LinkedList
部分是可选的。我只是更容易使用它(编码、通过通道、解码)。我将对图像执行相同的操作,这就是为什么我需要将其作为二进制文件,这就是为什么我需要将其从二进制文件转换回.bmp(处理后).但在这个线程中,我只是专注于从.bmp转换成二进制再转换回来,我有点卡住了。你到底为什么要把它转换成字符串呢?还要使用Schlemiel-the-Painter算法?而且,嗯,如果你没有注意到……bmp是二进制的,并且假设它是未压缩的,那么它不是“编码的”一点也不。你到底想用这些来完成什么?@nyrguds是的,我做错了,现在我发布了一个对我来说非常有效的解决方案。也许这不是最好的,但它确实对我有效。我花了一些时间在这方面,请仔细检查:)你仍然在使用.String Bug,你应该使用String Bu建器来避免大量的减慢和额外的内存使用。此外,你每8分一次,但是你只处理RGB,没有A,所以这个字符串只有3个字节。不应该是6个,而不是8个?@ Nyerguds谢谢你,会考虑你的建议和改进我的AlgORI。thm!至于字节数,是的,你是对的,因为另一个用例,我将其拆分为8,但肯定应该是6,因为我没有使用alpha值。你提供的链接很有用,谢谢。你仍然在使用。对于长字符串,你应该使用StringBuilder来避免大量的速度减慢和额外的内存使用。此外,你也在拆分Ting每8个,但是你只处理RGB,没有一个,所以这个字符串只有3个字节。不应该是6个,而不是8个?@ Nyerguds谢谢你,会考虑你的建议和改进我的算法!至于字节计数,是的,你是对的,因为另一个用例,我把8分了,但是肯定是6,因为我不使用alpha VA。你提供的链接是