2010-08-17 4 views
4

JAI를 사용하여 잠시 동안 ImageOutputStream을 byte []로 변환하려고 시도했습니다. 모든 입력을 부탁드립니다. 감사.ImageOutputStream을 byte []에 변환

죄송합니다. 여기에 코드 스 니펫이 있습니다. 제가 작업하고 있습니다. 이전에 게시해야했습니다. 내가 직면하고있는 문제는 ImageOutputStream에서 ByteArrayOutputStream을 얻을 수 있다는 것입니다. 하지만 항상 0 바이트를 제공합니다. 그러나 ByteArrayOuputStream 대신 FileOutputStream을 사용하면 0이 아닌 바이트가있는 파일에 쓸 수 있습니다. :

File file = new File("C:/TIFFImages/tiff-image.tiff"); 
FileInputStream in = new FileInputStream(file); 
long filelength = file.length(); 
byte[] bytes = new byte[(int)filelength]; 
int offset = 0; 
int numRead = 0; 

while (offset < bytes.length && (numRead=in.read(bytes, offset, bytes.length-offset)) >= 0) { 
    offset += numRead; 
} 
if (offset < bytes.length) { 
    throw new IOException("Could not completely read file "+file.getName()); 
} 

ByteArrayInputStream bais = new ByteArrayInputStream(bytes); 

RenderedImage src = JAI.create("stream", SeekableStream.wrapInputStream(bais, true)); 
RenderedOp renderedOp = MedianFilterDescriptor.create(src, MedianFilterDescriptor.MEDIAN_MASK_SQUARE , 1, null); 
BufferedImage image = renderedOp.getAsBufferedImage(); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

ImageOutputStream ios = ImageIO.createImageOutputStream(baos); 
//Instead of baos if I pass a FileOutputStream to the above function. It writes non zero 
//bytes to the output file 

TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi(); 
ImageWriter writer = tiffspi.createWriterInstance(); 
RenderedImage renderedImage = PlanarImage.wrapRenderedImage(src); 
writer.setOutput(ios); 
writer.write(image); 
writer.write(null,new IIOImage(image, null, null), param); 

System.out.println("After tiff ImageIO operations" + baos.toByteArray().length); 

감사합니다, 인 Vinay

+0

명확하게 할 수 있습니까? 이전에 IOS로 작성한 컨텐츠를 변환하려고합니까? –

답변

1

나는 Guillaume이 제안한 것에 매우 가깝다. 그 사이에 임시 파일에 쓸 필요가 없습니다.

ByteArrayOutputStream baos = new ByteArrayOutputStream(37628); 
ImageOutputStream ios = ImageIO.createImageOutputStream(baos); 

//Instead of baos if I pass a FileOutputStream to the above function. It writes non zero 
//bytes to the output file 

TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi(); 
ImageWriter writer = tiffspi.createWriterInstance(); 
RenderedImage renderedImage = PlanarImage.wrapRenderedImage(src); 
writer.setOutput(ios); 
writer.write(image); 
writer.write(null,new IIOImage(image, null, null), param); 

//Create a ByteArrayInputStream to read that ByteArrayOutputStream and read it from ImageIO 

ByteArrayInputStream bai = new ByteArrayInputStream(baos.toByteArray()); 
RenderedImage out = ImageIO.read(bai); 
int size = bos.toByteArray().length; 

System.out.println(""+ size); 

return bos.toByteArray 
+0

ImageIO jar 파일을 찾을 수 없습니다. 그걸 도와 줄 수 있어요 .. – Kishore

+0

findjar.com을 확인하십시오. 클래스가 발견되지 않는 예외도 좋습니다. – vinaynag

0

글쎄, 당신은 할 수 없을 것 출력 스트림에서를 참조하십시오.

이미지 개체에서 InputStream을 가져 와서 필요한 데이터를 읽으려고합니다.

그러나 실제 달성하려는 내용에 대해 자세히 설명해 주시면보다 효율적으로 도움을 드릴 수 있습니다. :)

예를 들어 이미지 크기를 바이트 단위로 표시하려는 경우에는 여러 가지 방법이 있습니다.

+0

출력 스트림에서 읽으려고하지 않고 출력을 ByteArrayOutputStream에 기록하려고합니다. 코드 주석에서 언급했듯이. FileOutputStream는, 일단 기입 해지면 크기가 0이 아닌 사이즈를 돌려줍니다. 그러나 ByteArrayOutputStream은 크기가 0입니다. TIFF Image를 압축하고이 코드에서 byte []를 반환하려고합니다. – vinaynag

+0

제 코드가 너무 빨리 읽었습니다. ByteArrayOutputStream의 상태를 확인하기 위해 실행중인 프로그램 (예 : Eclipse)을 단계별로 실행하려고 했습니까? 최악의 경우, 임시 파일에서 추출하여 ByteArrayInputStream을 사용하여 읽을 수 있습니다. 그래도 꽤 더러운. –

+0

예. 디버그 모드에서 코드를 단계별로 수행하면 바이트 배열 크기가 초기화 된 후 0이되지 않습니다. 임시 파일 생성이 작동 할 수도 있지만이 코드에서는 그렇게 할 여유가 없습니다. 그 사이에 파일 I/O없이 바이트 배열을 반환해야합니다. 이미지를 압축하는 다른 방법을 찾았습니다. 그러나이 접근법이 효과가 있었다면 더 좋았을 것입니다. 고마워. 고마워. 고마워. – vinaynag

3

가있는 ByteArrayOutputStream (대신 FileOutputStream에)으로하는 ImageOutputStream 만들기 화상 처리가 완료되면

ByteArrayOutputStream bos = new ByteArrayOutputStream(255); 
ImageOutputStream ios = ImageIO.createImageOutputStream(bos); 
// use "ios" for image processing 

하는 화상 바이트가 제공 될 것이다 : 다음 바이트를 ImageOutputStream 변환 수정 코드 []는 "ios"개체이지만 오프셋은 "ios"개체의 끝에 위치합니다. 따라서 "ios"개체의 시작 부분에 오프셋을 배치 한 다음 새 ByteArrayOutputStream 개체에 쓸 바이트를 읽어야합니다. 마지막으로 toByteArray()를 새 객체에서 반환합니다. 아래처럼 :

 public byte[] getBytes(ImageOutputStream ios) { 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(255); 
      byte imageByte; 
      long counter = 0; 
      try { 
        System.out.println("getStreamPosition()[BEFORE]=" + ios.getStreamPosition()); 
        ios.seek(0); 
        System.out.println("getStreamPosition()[AFTER]=" + ios.getStreamPosition()); 
      } catch (IOException e1) {      
        e1.printStackTrace(); 
      } 

      while (true) { 
        try { 
          bos.write(ios.readByte()); 
          counter++; 
        } catch (EOFException e) { 
          System.out.println("End of Image Stream"); 
          break; 
        } catch (IOException e) { 
          System.out.println("Error processing the Image Stream"); 
          break; 
        } 
      } 
      System.out.println("Total bytes read=" + counter); 
      byte[] retValue = bos.toByteArray(); 
      return retValue; 
    } 
3

난 당신이 작업이 끝나면 ImageOutputStream.flush()를 호출하지 않는 그것 때문에 확신 - 만든 IOS는 MemoryCacheOutputStream 인 경우, 일부 ImageIO에서 구현에 명시 적 플러시를 요구하는 것 같다.

+0

당신은 지금 나의 영웅입니다! 내 기본 ByteArrayOutputStream이 항상 비어있는 이유를 알아 내려고 노력했습니다. ImageOutputStream을 플러시하면 (자), 모든 것이 고쳐졌습니다. 감사! –

관련 문제