2016-12-07 19 views
1

나는 티파니 이미지를 가져 와서 가능한 한 12 원숭이 이미지 라이브러리가있는 자바 레이어가있는 레이어를 추가하는 데 관심이 있습니다.Java로 다중 페이지 티프 만들기

코드를 here에서 꼬집어서 tif에 텍스트를 추가하거나 같은 크기의 새로운 tif를 텍스트 만 만들면되지만 다중 페이지 tif로 저장되지는 ​​않습니다.

import javax.imageio.*; 
import javax.imageio.stream.ImageOutputStream; 
import java.awt.*; 
import java.awt.image.*; 
import java.io.*; 

public class ImageUtil { 

public static void main(String[] args) throws Exception { 

    BufferedImage src = ImageIO.read(new File("/path/to/main.tif")); 
    BufferedImage text = createTextLayer(src); 
    BufferedImage[] images = new BufferedImage[]{src, text}; 
    createMultiPage(images); 

} 

private static BufferedImage createTextLayer(BufferedImage src) { 
    int w = src.getWidth(); 
    int h = src.getHeight(); 
    BufferedImage img = new BufferedImage(
      w, h, BufferedImage.TYPE_INT_ARGB); 

    Graphics2D g2d = img.createGraphics(); 
    g2d.drawImage(img, 0, 0, null); 

    g2d.setPaint(Color.red); 
    g2d.setFont(new Font("Serif", Font.BOLD, 200)); 
    String s = "Hello, world!"; 
    FontMetrics fm = g2d.getFontMetrics(); 
    int x = img.getWidth() - fm.stringWidth(s) - 5; 
    int y = fm.getHeight() * 5; 
    g2d.drawString(s, x, y); 
    g2d.dispose(); 
    return img; 
} 

private static void createMultiPage(BufferedImage[] images) throws IOException { 

    File tempFile = new File("/new/file/path.tif"); 
    //I also tried passing in stream var below to the try, but also receive java.lang.UnsupportedOperationException: Unsupported write variant! 
    //OutputStream stream = new FileOutputStream(tempFile); 

    // Obtain a TIFF writer 
    ImageWriter writer = ImageIO.getImageWritersByFormatName("TIFF").next(); 

    try (ImageOutputStream output = ImageIO.createImageOutputStream(tempFile)) { 
     writer.setOutput(output); 

     ImageWriteParam params = writer.getDefaultWriteParam(); 
     params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
     params.setCompressionType("None"); 

     //error here: java.lang.UnsupportedOperationException: Unsupported write variant! 
     writer.prepareWriteSequence(null); 

     for (int i = 0; i < images.length; i++){ 
      writer.writeToSequence(new IIOImage(images[i], null, null), params); 
     } 

     // We're done 
     writer.endWriteSequence(); 
    } 

} 
} 

메이븐 : : 예를 들어 내가 이미지와 생성 된 텍스트 - 이미지에서 여러 페이지 tif 여야를 만들 수있는 방법

<dependency> 
    <groupId>com.twelvemonkeys.imageio</groupId> 
    <artifactId>imageio-tiff</artifactId> 
    <version>3.2.1</version> 
</dependency> 

?

jpgs를 실행하려면 다음 코드를 얻을 수 있었지만 jpgs에는 레이어가 없습니다.

public static void testWriteSequence() throws IOException { 
    BufferedImage[] images = new BufferedImage[] { 
      new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB), 
      new BufferedImage(110, 100, BufferedImage.TYPE_INT_RGB), 
      new BufferedImage(120, 100, BufferedImage.TYPE_INT_RGB), 
      new BufferedImage(130, 100, BufferedImage.TYPE_INT_RGB) 
    }; 

    Color[] colors = {Color.BLUE, Color.GREEN, Color.RED, Color.ORANGE}; 

    for (int i = 0; i < images.length; i++) { 
     BufferedImage image = images[i]; 
     Graphics2D g2d = image.createGraphics(); 
     try { 
      g2d.setColor(colors[i]); 
      g2d.fillRect(0, 0, 100, 100); 
     } 
     finally { 
      g2d.dispose(); 
     } 
    } 

    //ImageWriter writer = createImageWriter(); 
    ImageWriter writer = ImageIO.getImageWritersByFormatName("JPEG").next(); 

    ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
    try (ImageOutputStream output = ImageIO.createImageOutputStream(buffer)) { 
     writer.setOutput(output); 

     ImageWriteParam params = writer.getDefaultWriteParam(); 
     params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 

     writer.prepareWriteSequence(null); 

     params.setCompressionType("JPEG"); 
     writer.writeToSequence(new IIOImage(images[0], null, null), params); 

     params.setCompressionType("JPEG"); 
     writer.writeToSequence(new IIOImage(images[1], null, null), params); 

     params.setCompressionType("JPEG"); 
     writer.writeToSequence(new IIOImage(images[2], null, null), params); 

     params.setCompressionType("JPEG"); 
     writer.writeToSequence(new IIOImage(images[3], null, null), params); 

     writer.endWriteSequence(); 

     File tempFile = new File("/path/to/new/file.jpg"); 
     OutputStream out = new FileOutputStream(tempFile); 

     buffer.writeTo(out); 
    } 
} 

감사합니다.

+0

내가 나에게 대답을 줄 것이다 여기 검색에 "자바 멀티 페이지 티파니 만들기"를 넣어 경우; 그게 열심히 일하는거야 ?? – gpasch

+0

@gpasch 링크를 공유하여 내가 본 내용을 평가할 수 있도록주의를 기울여야합니까? 아니면 단지 StackOverflow 경찰입니까? – jonD02

+0

@gpasch이 질문에 이미 답변 한 것으로 생각되면 투표를 닫아 중복으로 표시해야합니다. 무작위로 작성한 의견이나 실명 투표보다 더 많은 비용이 들지만 그 대가로 실제로는 지역 사회에 도움이됩니다. – haraldK

답변

3

표준 ImageIO API를 사용하여 여러 페이지 이미지 (TIFF와 같은 형식으로 지원)로 작성할 수 있습니다.

TwelveMonkeys ImageIO 프로젝트의 테스트 사례에서 예를 들어 TIFFImageWriterTest.testWriteSequence 메서드를 사용하는 방법을 예를 참조하십시오.

중요한 부분 :

BufferedImage[] images = ... 
OutputStream stream = ... 

// Obtain a TIFF writer 
ImageWriter writer = ImageIO.getImageWritersByFormatName("TIFF").next(); 

try (ImageOutputStream output = ImageIO.createImageOutputStream(stream)) { 
    writer.setOutput(output); 

    ImageWriteParam params = writer.getDefaultWriteParam(); 
    params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 

    writer.prepareWriteSequence(null); 

    // This is from the test case, you probably want to replace this with a for loop... 
    // ...and use a single compression type for all the images. 
    params.setCompressionType("JPEG"); 
    writer.writeToSequence(new IIOImage(images[0], null, null), params); 

    params.setCompressionType("None"); 
    writer.writeToSequence(new IIOImage(images[1], null, null), params); 

    params.setCompressionType("None"); 
    writer.writeToSequence(new IIOImage(images[2], null, null), params); 

    params.setCompressionType("PackBits"); 
    writer.writeToSequence(new IIOImage(images[3], null, null), params); 

    // We're done 
    writer.endWriteSequence(); 
} 
+0

답변 해 주셔서 감사합니다. 나는 여러 가지 방법으로 코드를 시도했지만 IllegalStateException을 받았다. getOutput() == writer.prepareWriteSequence에서 null 예외. 위의 코드를 업데이트하여 링크를 확인한 후 해결책을 찾고자하는 위치로 업데이트했습니다. 위의 예에서 누락 된 것이 무엇인지 아십니까? 감사. – jonD02

+0

@ jonD02 작은 실수를 했으므로 질문에 대한 설명에서 설명했습니다. 내 코드의'stream'은'java.io.OutputStream'이지만, 여러분의 코드에서는 다른 것 인'javax.imageio.stream.ImageOutputStream'이며 예외를 얻는 이유입니다. – haraldK