그래서 저는 JPG 파일을 읽으며 '헤더'데이터를 읽었고 이제 실제 이미지 데이터를 읽었습니다. 문제는 미리 이미지의 크기를 모르기 때문에 읽을 수있는 배열을 만들 수 없다는 것입니다. 내가 할 수있는 일은 'header'의 끝에서부터 이미지의 끝까지 (2 바이트 : FF와 D9), ByteArrayOutputStream은 읽혀지는대로 각 값을 유지하기 위해 바이트 FF 뒤에 바이트 D9가 발생할 때까지 읽혀진다. . 이 일을 어떻게 하죠?특정 바이트가 발생할 때까지 JPG 파일을 읽으십시오.
내 코드는 지금까지, 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를 끔찍하게 오해 할 수 있습니다. 내가 있으면 주저하지 말고 말해주세요.
'ByteArrayOutputStream' 또는'ByteBuffer' 또는 이와 유사한 것을 사용하는 것이 좋습니다. 'ArrayList'는'Byte' 객체로서'byte'를 복싱 할 때마다 많은 메모리가 필요합니다. –
byteData [0]. equals ("FF")'는 byteData [0] == (byte) 0xFF'이어야하며, byteData는 byte [] 배열이다. 'byte'와'String'을 비교하는 것은 효과가 없습니다. –
다음은'byte []'배열로 전환하는 것이 가장 좋습니다. 'String'을 사용하는 것은 불필요한 비 효율성입니다. –