4

複数のマルチページ.tifファイルを取得し、それらを1つのマルチページtifファイルに結合しようとしています。

この質問でいくつかのコードを見つけましたが、それは個々の.tifファイルの最初のページを取得し、それらの最初のページで新しい複数ページの.tifを作成するだけのようです。

この同じコードがソースの.tifファイルからすべてのページを取得し、それらをすべて結合された.tifに配置するような小さな変更はありますか?

明確にするために、私はソースファイルが欲しいです:

  • SourceA.tif(3ページ)
  • SourceB.tif(4ページ)
  • SourceC.tif(1ページ)

に結合されます

  • Combined.tif(8ページ)

また、.tifの解像度と圧縮を指定できるようにしたいのですが、JAIがそれをサポートしているかどうかはわかりません。また、正解の必要はありません。

ディレクトリ内のすべての.tifファイルをロードするように私が変更した、参照された質問のコードは、簡単に答えられるように以下のとおりです。

public static void main(String[] args) {
        String inputDir = "C:\\tifSources";
        File sourceDirectory = new File(inputDir);
        File file[] = sourceDirectory.listFiles();
        int numImages = file.length;

        BufferedImage image[] = new BufferedImage[numImages];

        try
        {
            for (int i = 0; i < numImages; i++)
            {
                SeekableStream ss = new FileSeekableStream(file[i]);
                ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", ss, null);
                PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(0), null, null, OpImage.OP_IO_BOUND);
                image[i] = op.getAsBufferedImage();
            }

            TIFFEncodeParam params = new TIFFEncodeParam();
            OutputStream out = new FileOutputStream(inputDir + "\\combined.tif"); 
            ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params);
            List<BufferedImage> imageList = new ArrayList<BufferedImage>();   
            for (int i = 0; i < numImages; i++)
            {
                imageList.add(image[i]); 
            }
            params.setExtraImages(imageList.iterator()); 
            encoder.encode(image[0]); 
            out.close();
        }
        catch (Exception e)
        {
            System.out.println("Exception " + e);
        }
    }
4

1 に答える 1

8

単一の .tif でページを反復処理することについて、いくつかの小さな部分が欠けていることはわかっていましたが、それがどこにあるのかわかりませんでした。

インターネットでさらに検索すると、次のことを行うのではなく、それを見つけることができました。

PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(0), null, null, OpImage.OP_IO_BOUND);

次のようなものを使用して、現在のドキュメントのすべてのページを繰り返し処理したかったのです。

int numPages = decoder.getNumPages();
for(int j = 0; j < numPages; j++)
{
     PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(j), null, null, OpImage.OP_IO_BOUND);
     images.add(op.getAsBufferedImage());
}

これにより、すべての .tif のすべてのページがイメージ リストに追加されます。最後の落とし穴の 1 つは、

encoder.encode(images.get(0));

最初のページが新しい .tif に 2 回含まれることになるため、次の呼び出しで最初のページを追加しない中間ループとリスト作成を追加しました。

params.setExtraImages(imageList.iterator());

これにより、最初のページが「ExtraImages」から除外され、エンコードの呼び出しで追加されます。

最終的に更新されたコードは次のとおりです。

public static void main(String[] args) {
        String inputDir = "C:\\tifSources";
        File faxSource = new File(inputDir);
        File file[] = faxSource.listFiles();
        System.out.println("files are " + Arrays.toString(file));
        int numImages = file.length;

        List<BufferedImage> images = new ArrayList<BufferedImage>();

        try
        {
            for (int i = 0; i < numImages; i++)
            {
                SeekableStream ss = new FileSeekableStream(file[i]);
                ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", ss, null);

                int numPages = decoder.getNumPages();
                for(int j = 0; j < numPages; j++)
                {
                    PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(j), null, null, OpImage.OP_IO_BOUND);
                    images.add(op.getAsBufferedImage());
                }
            }

            TIFFEncodeParam params = new TIFFEncodeParam();
            OutputStream out = new FileOutputStream(inputDir + "\\combined.tif"); 
            ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params);
            List<BufferedImage> imageList = new ArrayList<BufferedImage>();   
            for (int i = 1; i < images.size(); i++)
            {
                imageList.add(images.get(i)); 
            }
            params.setExtraImages(imageList.iterator()); 
            encoder.encode(images.get(0));
            out.close();
        }
        catch (Exception e)
        {
            System.out.println("Exception " + e);
        }
    }
于 2011-07-12T20:26:39.907 に答える