Java – how to combine multiple multi page TIF files into one TIF

I tried to take multiple pages TIF files and combine them into a multi - Page TIF file

I found some code in this question, but it seems to take only each individual The first page of the TIF file and creates a new multi - page with these first pages tif.

Whether there is a small change that I don't see will lead to the same code from the source Get each page from the TIF file and put them all into the combined tif?

For clarification, I want the source file:

> SourceA. TIF (page 3) > sourceb TIF (page 4) > sourcec TIF (1 page)

Merge into

> combined. TIF (8 pages)

I also hope to be able to specify TIF resolution and compression, but I'm not sure if Jai supports it, and it's not a necessary condition for the correct answer

I modified the code in the reference problem to load all the files in the directory TIF file to answer:

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

Solution

I know I'm just missing out on something in a single A small part of the iteration page in TIF, I'm just not sure where it is

More Internet searches let me discover, not do:

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

I want to iterate over each page in the current document with the following:

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

This will take everyone Each page of TIF is added to the image list The last trap is the last call

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

Will result in the first page in the new TIF twice, so I added an intermediate loop and list filling, which will not add the first page in the call:

params.setExtraImages(imageList.iterator());

This keeps the first page out of "extraimages" and adds a call to the encoding

The final updated code is:

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",null);

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

            TIFFEncodeParam params = new TIFFEncodeparam();
            OutputStream out = new FileOutputStream(inputDir + "\\combined.tif"); 
            ImageEncoder encoder = ImageCodec.createImageEncoder("tiff",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);
        }
    }
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>