2014-10-09 2 views
1

그래서 저는 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를 끔찍하게 오해 할 수 있습니다. 내가 있으면 주저하지 말고 말해주세요.

+1

'ByteArrayOutputStream' 또는'ByteBuffer' 또는 이와 유사한 것을 사용하는 것이 좋습니다. 'ArrayList '는'Byte' 객체로서'byte'를 복싱 할 때마다 많은 메모리가 필요합니다. –

+0

byteData [0]. equals ("FF")'는 byteData [0] == (byte) 0xFF'이어야하며, byteData는 byte [] 배열이다. 'byte'와'String'을 비교하는 것은 효과가 없습니다. –

+1

다음은'byte []'배열로 전환하는 것이 가장 좋습니다. 'String'을 사용하는 것은 불필요한 비 효율성입니다. –

답변

0

이미지의 크기는 SOF (Start of Frame) 마커에 있습니다.

다시 읽는 중에 원래의 포스터가 JPEG 스트림의 구조에 착각했다고 생각합니다.

SOI 마켓으로 시작하고 EOI 마커로 끝나야합니다. 그 이상으로, 마커는 순서가 다를 수 있습니다.

다른 제한 사항이 있습니다. SOF 마커는 SOS 마커 앞에 와야합니다. DHT와 DQT 마커는 그들을 사용하는 SOS 마커보다 먼저 나타나야합니다.

그 외에도 스트림 시작 부분에 APPn 마커가 필요한 다양한 JPEG 파일 형식이 있습니다.

위의 코드와 질문은 JPEG 스트림의 가변 특성을 반영하지 않습니다.

관련 문제