java – 如何将多个多页tif文件组合成一个tif
发布时间:2020-12-15 08:41:58 所属栏目:Java 来源:网络整理
导读:我试图采取多个多页.tif文件,并将它们组合成一个多页的tif文件. 我在这个question中找到了一些代码,但它似乎只取了每个单独的.tif文件的第一页,并用这些第一页创建了新的多页.tif. 是否有一个小的改变,我没有看到会导致相同的代码从源.tif文件中获取每个页面
我试图采取多个多页.tif文件,并将它们组合成一个多页的tif文件.
我在这个question中找到了一些代码,但它似乎只取了每个单独的.tif文件的第一页,并用这些第一页创建了新的多页.tif. 是否有一个小的改变,我没有看到会导致相同的代码从源.tif文件中获取每个页面并将它们全部放入组合的.tif? 为了澄清,我想要源文件: > SourceA.tif(3页) 合并成 > 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,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); } } 解决方法
我知道我只是遗漏了一些关于在单个.tif中迭代页面的一小部分,我只是不确定它在哪里.
更多的互联网搜索让我发现,而不是做: PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(0),OpImage.OP_IO_BOUND); 我想用以下内容迭代当前文档中的每个页面: 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()); } 这会将每个.tif的每个页面添加到图像列表中.最后一个陷阱就是最后的召唤 encoder.encode(images.get(0)); 会导致第一页在新的.tif中两次,所以我添加了一个中间循环和列表填充,它不会在调用中添加第一页: 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",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); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |