读取JPG文件,直到出现某些字节

时间:2014-10-09 00:08:54

标签: java file jpeg file-header

所以我正在阅读JPG文件,我已经读完了'标题'数据,现在我正在查看实际的图像数据。事实是,我事先并不知道图像的大小,所以我无法创建一个数组来读取。但是,我可以做的是从“标题”的末尾读取,直到图像的结尾(两个字节:FF和D9),ByteArrayOutputStream来保存读取的每个值,直到我遇到字节字节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。如果我,请不要犹豫告诉我。

1 个答案:

答案 0 :(得分:0)

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

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

必须从SOI市场开始,以EOI标记结束。除此之外,标记的排序可能会有所不同。

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

最重要的是,有各种JPEG文件格式需要在流的开头有一个APPn标记。

上面的代码和问题没有反映JPEG流的变量性质。