Java 读取JPG文件,直到出现特定字节

Java 读取JPG文件,直到出现特定字节,java,file,jpeg,file-header,Java,File,Jpeg,File Header,所以我正在读取JPG文件,我已经读取完“header”数据,现在我进入实际的图像数据。问题是,我事先不知道图像的大小,所以我无法创建一个数组来读取。不过,我可以做的是,从“header”的末尾一直读取到图像的末尾两个字节:FF和D9,通过tearrayoutputstream保存读取的每个值,直到遇到字节FF之后的字节D9。我该怎么做呢 到目前为止,我的代码包括JPG识别,以便您了解上下文: // check header data, assign header data to importan

所以我正在读取JPG文件,我已经读取完“header”数据,现在我进入实际的图像数据。问题是,我事先不知道图像的大小,所以我无法创建一个数组来读取。不过,我可以做的是,从“header”的末尾一直读取到图像的末尾两个字节:FF和D9,通过tearrayoutputstream保存读取的每个值,直到遇到字节FF之后的字节D9。我该怎么做呢

到目前为止,我的代码包括JPG识别,以便您了解上下文:

// check header data, assign header data to important fields

    // Start Of Image (SOI) must be FFD8 and the next marker must be FF
    if(!(bData[0] == (byte) 0xFF && bData[1] == (byte) 0xD8
            && this.bData[2] == (byte) 0xFF))
        this.isValid = false;

    // check if file is not valid
    if(!isValid) {
        System.err.printf("ERROR: File %s is not"
                        + " registered as a bitmap!\n", filename);
        Logger.getLogger(Bitmap.class.getName()).log(Level.SEVERE, null, new IllegalArgumentException());
    }

    // If the next values are correct, then the data stream starts at SOI
    // If not, the data stream is raw
    this.isRawDataStream = !(bData[3] == (byte) 0xE0
            && bData[6]  == (byte) 0x4A
            && bData[7]  == (byte) 0x46
            && bData[8]  == (byte) 0x49
            && bData[9]  == (byte) 0x46
            && bData[10] == (byte) 0x00);

    // get size of image
    ByteArrayOutputStream iData = new ByteArrayOutputStream();

    // start at index 20 of the file (end of 'header')
    // read until End of Image
    /* while(!(iData at i is FF and iData at i+1 is D9)) {
        ???
    }
    */
编辑
我这样做是为了更好地理解文件格式和其他事情,我可能会对JFIF产生可怕的误解。如果我是,请毫不犹豫地告诉我

图像的大小在SOF开始帧标记中

在重读时,我认为原始海报在JPEG流的结构上是错误的

它必须以SOI市场开始,以EOI标记结束。除此之外,标记可以在顺序上有所不同

还有一些其他限制: SOF标记必须位于SOS标记之前。 DHT和DQT标记必须出现在使用它们的任何SOS标记之前

除此之外,还有各种JPEG文件格式需要在流的开头添加APPn标记


上面的代码和问题并不反映JPEG流的可变性质。

我建议使用ByteArrayOutputStream或ByteBuffer或类似的格式。由于将每个字节装箱为字节对象,ArrayList将占用大量内存。此外,byteData[0]。如果byteData是字节[]数组,则equalsFF应为byteData[0]==字节0xFF。将字节与字符串进行比较是行不通的。那么最好切换到byte[]数组。使用字符串将是一种不必要的低效。我不知道您可以将十六进制值转换为字节,谢谢!这甚至使我的位图类也更加高效!:@约翰库格曼让我们。