2011-05-09 4 views
0

바이트 배열로 코딩 된 이미지를 받으려고합니다.바이트 배열 이미지를 다시 작성하십시오.

그것은 이미지가 너무 큰 경우 잘 작동하지만 난 많은 시간을 입력 스트림을 읽을 때, 선 모든 이미지 바이트를 얻을 :

BufferedImage img = ImageIO.read(new ByteArrayInputStream(finalData)); 

반환 null합니다.

여기 내 코드입니다 :

byte[]imgSize = new byte[SIZE_OF_LENGTH_ARRAY]; 
bis.read(imgSize, 0, SIZE_OF_LENGTH_ARRAY); 
ByteBuffer bb = ByteBuffer.wrap(imgSize); 
int size = bb.getInt(); 

System.out.println("Client: size="+size); 
byte[] tmpData = new byte[size]; 
System.out.println("tmpData length = "+tmpData.length); 
int readen = bis.read(tmpData, 0, tmpData.length); 
System.out.println("readen="+readen); 

byte[]finalData = new byte[size]; 

if(readen == size){ 
    finalData = tmpData; 
} 
else{ 
    int totalRead = readen; 
    int j=1; 

    while(totalRead<size){ 
     System.out.println("-----------append number "+j+"----------"); 
     System.out.println("totalRead="+totalRead); 

     for(int i=0;i<tmpData.length;i++){ 
      finalData[i]=tmpData[i]; 
     } 

     tmpData = new byte[size-totalRead]; 
     int tmpRead = bis.read(tmpData, 0, size-totalRead); 
     System.out.println("tmpRead="+tmpRead); 

     for(int i=0;i<tmpData.length;i++){ 
      finalData[i+totalRead]=tmpData[i]; 
     } 

     totalRead+=tmpRead; 
     j++; 
    } 
    System.out.println("totalRead final="+totalRead); 
} 

BufferedImage img = ImageIO.read(new ByteArrayInputStream(finalData)); 

그리고 출력 예입니다 : 내가 잘 85,921 바이트를 읽는 동안

---Client: sending mess number 1--- 
Client: size=31099 
tmpData length = 31099 
readen=31099 
---Client: sending mess number 2--- 
Client: size=85921 
tmpData length = 85921 
readen=17520 
-----------append number 1---------- 
totalRead=17520 
tmpRead=17520 
-----------append number 2---------- 
totalRead=35040 
tmpRead=17520 
-----------append number 3---------- 
totalRead=52560 
tmpRead=31408 
-----------append number 4---------- 
totalRead=83968 
tmpRead=1953 
totalRead final=85921 
image null 

ImageIO.Read는 널 이미지를 만듭니다. 내가 비스 모르는

답변

0

이 줄은 이전 반복에서 바이트를 덮어 쓸 수 있습니다 :

while(totalRead<size){ 
     System.out.println("-----------append number "+j+"----------"); 
     System.out.println("totalRead="+totalRead); 
     //I suspect this is unnecessary and one source of the error 
     //this loop would overwrite data from the last iteration's tmpData 
     for(int i=0;i<tmpData.length;i++){ 
      finalData[i]=tmpData[i]; 
     } 
     tmpData = new byte[size-totalRead]; 
     int tmpRead = bis.read(tmpData, 0, size-totalRead); 
     System.out.println("tmpRead="+tmpRead); 
     for(int i=0;i<tmpData.length;i++){ 
      finalData[i+totalRead]=tmpData[i]; //append tmpData 
     } 
     totalRead+=tmpRead; 
     j++; 
    } 

반복하는 동안 각각 10 바이트를 읽는다고 가정 해 보겠습니다.

첫 번째 실행에서는 최종 데이터의 모든 요소를 ​​0으로 설정 한 다음 10 바이트를 읽고 finalData의 요소 0-9를 설정합니다.

두 번째 반복에서 tmpData (바이트 0-9)의 내용을 반복하고 바이트 0-9를 겹쳐 써서 바이트 10-19를 읽은 다음 추가합니다. (지금까지는 좋았습니다.)

세 번째 반복에서는 tmpData (두 번째 반복에서 바이트 10-19)의 내용을 건너 뛰고 finalData의 바이트 0-9를 덮어 씁니다. 여기에 하나의 오류가 있습니다.

+0

그래 그게 정확히 ... 너무 서둘러, 나는 그것을 놓쳤다. 잠시 전에이 반복을 넣으면 매력처럼 작동합니다. 감사합니다. . – minod

+0

여전히 바이트 배열로 데이터를 읽는 이유는 여전히 대답하지 않습니다. 그런 다음 ByteArrayInputStream을 ImageIO.read에 대한 인수로 만듭니다. ImageIO.read에 원본 스트림을 제공하십시오. 그것은 당신을 위해 데이터를 읽을 것입니다. – Kaj

0

이지만,이 라인은 아마 잘못 :

bis.read(imgSize, 0, SIZE_OF_LENGTH_ARRAY); 

당신은 항상 읽기에서 반환 된 값을 확인해야합니다. 읽기는 지정한 것보다 적게 읽을 수 있습니다.

편집 :

byte[] buffer = new byte[1024 * 32]; 
int len = 0; 
while ((len = in.read(buffer)) > -1) { 
    out.write(buffer, 0, len); 
} 

편집 : 2 :

그런데 왜이 같은 일을하지 않습니다 :

ImageIO.read(bis); 

이 일반적 스트림에서 모든 데이터를 읽는 방법입니다

+0

죄송합니다,이 라인을 잊어 버렸습니다 : bis = new BufferedInputStream (socket.getInputStream()); – minod

+0

음, 현재 내 bytearray에만 내 이미지가 있지만, 다음에는이 동일한 배열에 다른 정보가 있습니다. 그래서 이미지에 관한 바이트를 추출합니다. – minod