2014-07-16 3 views
0

FileInputStream 형식의 두 TIFF 이미지를 단일 Tiff 이미지로 병합하려고합니다. 이미지가 병합되지만 출력 파일은 검은 색으로 표시됩니다. 원본 이미지와 변환 된 이미지를 비교하면서 변환 된 이미지의 비트 심도가 1로 변경되었음을 알 수있었습니다. 아무도이 솔루션을 제공 할 수 있습니까? 내가 사용하고있는 코드는 다음과 같습니다FileInputStream에서 Image로 변환하면 출력 이미지가 검은 색이됩니다.

public class MergerTiffUsingBuffer { 

    public static void main(String[] args) { 

     File imageFile1 = new File("D:/Software/pdfbox-1.3.1.jar/tiff/FLAG_T24.TIF"); 
     File imageFile2 = new File("D:/Software/pdfbox-1.3.1.jar/tiff/CCITT_3.TIF"); 
     try { 
      FileInputStream fis1 = new FileInputStream(imageFile1); 
      FileInputStream fis2 = new FileInputStream(imageFile2); 
      List<BufferedImage> bufferedImages=new ArrayList<>(); 
      List<FileInputStream> inputStreams=new ArrayList<>(); 
      inputStreams.add(fis1); 
      inputStreams.add(fis2); 
      Iterator<?> readers = ImageIO.getImageReadersByFormatName("tiff"); 
      ImageReader reader = (ImageReader) readers.next(); 

      for(FileInputStream inputStream:inputStreams){ 
       ImageInputStream iis = ImageIO.createImageInputStream(inputStream); 
       reader.setInput(iis); 
       ImageReadParam param = reader.getDefaultReadParam(); 
       Image image = reader.read(0, param); 

       BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB); 
       OutputStream out = new FileOutputStream("D:/Software/pdfbox-1.3.1.jar/tiff/MergedTiff.TIF"); 
       BufferedImage binarized = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(),BufferedImage.TYPE_BYTE_BINARY); 
       ImageIO.write(binarized, "tiff", out); 
       bufferedImages.add(bufferedImage); 
      } 
      System.out.println(bufferedImages.size()); 
     } catch (IOException e2) { 
      e2.printStackTrace(); 
     } 
    } 
} 
+0

당신이 당신의 다음 코드 줄에서 getWidth()와 getHeight()에 인수로 전달하는 이유 널 (null)에 자세히 설명해 수 : ** BufferedImage bufferedImage = 새로운 BufferedImage (image.getWidth (null), image.getHeight (null), BufferedImage.TYPE_INT_RGB); **. –

+0

image.getWidth는 ImageObserver 인터페이스를 입력으로 허용하지만 여기서는 적용 할 수 없습니다 (내가 추측하고 있습니다). 이것이 null 인 이유입니다. – Anirban

+1

'null' 인수는 단순히 "오래된"이미지 처리의 인공물 일뿐입니다. ImageObserver 여야합니다. 없으면 http://docs.oracle.com/javase/8/docs/api/java/awt/MediaTracker.html을 사용하여 이미지가로드 될 때까지 기다려야합니다. 어떤 경우 든 : 당신은'BufferedImage.TYPE_BYTE_BINARY'을 생성하고 있습니다. 그래서 왜 1보다 약간 다른 비트 깊이를 기대합니까? 이것은 * binary *입니다. 0 또는 1 대신에'BufferedImage.TYPE_INT_RGB'을 사용해주세요. – Marco13

답변

0

당신은 이미지 데이터를 복사하는 방법에 대한 약간의 혼동이 될 것으로 보인다. 다른 이미지의 치수를 전달하여 새로운 빈 이미지를 만들면 복사되지 않습니다 ... 따라서 완전히 검은 이미지는 코드를 실행 한 후 기대할 수있는 이미지입니다.

교체하여이 같은 뭔가 루프 :

for (FileInputStream inputStream : inputStreams) { 
    ImageInputStream iis = ImageIO.createImageInputStream(inputStream); 
    reader.setInput(iis); 

    BufferedImage image = reader.read(0, null); // a) BufferedImage is returned! b) null param is fine! 

    BufferedImage binarized = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_BINARY); 

    // The following 7 lines is the important part you were missing: 
    Graphics2D g = binarized.createGraphics(); 
    try { 
     g.drawImage(image, 0, 0, null); 
    } 
    finally { 
     g.dispose(); 
    } 

    OutputStream out = new FileOutputStream("D:/Software/pdfbox-1.3.1.jar/tiff/MergedTiff.TIF"); 

    ImageIO.write(binarized, "tiff", out); // You probably want to check return value (true/false)! 

    bufferedImages.add(image); 
} 
+0

감사합니다 HaraldK, 솔루션 않았다. 그러나 두 개의 입력 스트림을 병합하여 단일 이미지를 만들려고 할 때 두 번째 이미지가 검은 색으로 표시됩니다. 이걸 좀 도와 주실 래요? – Anirban

+0

"2 개의 입력 스트림을 병합하여 단일 이미지를 만드는 방법"은 무엇입니까? 두 이미지에서 다중 페이지 TIFF를 만들려고합니까? – haraldK

+0

예. 하지만 TIFF 이미지가 아니라 해당 이미지의 fileinputstream이 있습니다. 이 일을 할 수있는 방법이 있습니까? 내가 inputstreams에서 두 TIFF 이미지를 생성하고 outputstream에 저장하고 그들을 병합 할 수 있지만 이미지의 저장을 피하기 위해 병합 싶어요. – Anirban

관련 문제