2016-12-07 102 views
1

私はtif画像を撮り、可能であればTwelve Monkeys画像ライブラリを使用して、Javaでテキストを含むレイヤーを追加することに興味があります。JavaでマルチページTiffを作成する

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(); 
    } 

} 
} 

のMaven:

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

はどのようにして、画像と生成されたテキスト、画像から複数ページのTIFを作成することができますか?

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

私は私に答えを与えるだろう、ここで検索の「Javaを使用したマルチページのTIFFを作成する」を置けば、それは勤勉な労働ですか? – 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()== null writer.prepareWriteSequenceでの例外。あなたのリンクをチェックして解決策を探した後、私が上にいる場所に私のコードを更新しました。上記の私の例から何が欠けているか知っていますか?ありがとう。 – jonD02

+0

@ jonD02あなたは小さな間違いをしました。私はあなたの質問にコメントで説明しました。私のコードの 'stream'は' java.io.OutputStream'ですが、あなたのコードではそれは 'javax.imageio.stream.ImageOutputStream'です。これは別のもので、例外を取得する理由です。 – haraldK

関連する問題