Java 读取JPG文件,直到出现特定字节
所以我正在读取JPG文件,我已经读取完“header”数据,现在我进入实际的图像数据。问题是,我事先不知道图像的大小,所以我无法创建一个数组来读取。不过,我可以做的是,从“header”的末尾一直读取到图像的末尾两个字节:FF和D9,通过tearrayoutputstream保存读取的每个值,直到遇到字节FF之后的字节D9。我该怎么做呢 到目前为止,我的代码包括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
// 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[]数组。使用字符串将是一种不必要的低效。我不知道您可以将十六进制值转换为字节,谢谢!这甚至使我的位图类也更加高效!:@约翰库格曼让我们。