Java实现多个单张tif文件合并成一个多页tif文件

 更新时间:2023年09月20日 15:25:26   作者:风行無痕  
业务部门需要将多个单张的tiff文件,合并成一个多页的tiff文件,本文就来介绍一下如何实现,具有一定的参考价值,感兴趣的可以了解一下

一、需求场景

业务部门需要将多个单张的tiff文件,合并成一个多页的tiff文件,拒绝使用第三方成品的软件,那么我们就寻求通过java代码来处理,其实可能python处理会更简单一点。

二、功能实现

maven的pom依赖里面直接加入以下内容:

记得加入repository,否则会无法下载。

  <dependencies>
 <dependency>
    <groupId>com.sun.media</groupId>
    <artifactId>jai-codec</artifactId>
    <version>1.1.3</version>
</dependency>
  </dependencies>
  <repositories>
	  <repository>
	    <id>mvnrepository</id>
	    <name>mvnrepository</name>
	    <url>https://repository.jboss.org/maven2/</url>
	 </repository>
  </repositories>

直接贴代码

package com.zx.tool.tif;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.TIFFEncodeParam;
import com.sun.media.jai.codec.TIFFField;
/**
 * 	多张单页tif文件合并成一张多页tif文件
 * @author xiang
 *
 */
public class MergeTif {
	public static void main(String[] args) throws Exception {
		merge2OneTif();
	}
	public static void merge2OneTif() {
		try {
			int filezise = 0;
			DateFormat df=new SimpleDateFormat("yyyyMMdd HHmmss");
			String inputPath = "d:\\TiffMerge\\input\\";
			String outputPath = "d:\\TiffMerge\\output\\new_"+ df.format(new Date()) +".tif";
			// tif文件所在目录
			File[] files = new File(inputPath).listFiles();
			ArrayList<PlanarImage> pages = new ArrayList<PlanarImage>(files.length - 1);
			FileSeekableStream[] stream = new FileSeekableStream[files.length];
			for (int i = 0; i < files.length; i++) {
				System.out.println(files[i].getCanonicalPath());
				// 只处理tif文件
				if(!files[i].getName().endsWith(".tif"))
					continue;
				stream[i]= new FileSeekableStream(files[i].getCanonicalPath());
				filezise = filezise + 1;
			}
			// 将第一个tif文件作为第一页
			PlanarImage firstPage = JAI.create("stream", stream[0]);
			for (int i = 1; i < files.length; i++) {
				// 只处理tif文件
				if(!files[i].getName().endsWith(".tif"))
					continue;
				PlanarImage page = JAI.create("stream", stream[i]);
				pages.add(page);
			}
			TIFFEncodeParam param = new TIFFEncodeParam();
			// 设置压缩模式 压缩图片大小 避免出现合并后尺寸过大的问题
			param.setCompression(TIFFEncodeParam.COMPRESSION_PACKBITS);
			TIFFField[] extras = new TIFFField[4];
			 extras[0] = new TIFFField(262, TIFFField.TIFF_SHORT, 1, (Object) new short[] { 6 });
             extras[1] = new TIFFField(282, 5, 1, (Object) new long[][]{{(long) 200, 1}, {0, 0}});
             extras[2] = new TIFFField(283, 5, 1, (Object) new long[][]{{(long) 200, 1}, {0, 0}});
             extras[3] = new TIFFField(258, TIFFField.TIFF_SHORT, 1, (Object) new char[] { 8 });
             param.setExtraFields(extras);
			//合并后新生成的图片
			OutputStream os = new FileOutputStream(outputPath);
			ImageEncoder enc = ImageCodec.createImageEncoder("tiff", os, param);
			param.setExtraImages(pages.iterator());
			enc.encode(firstPage);
			for (int i = 0; i < files.length; i++) {
				if(stream[i]!=null)
					stream[i].close();
			}
			os.close();
			System.out.println("merge "+ filezise +" Tif success");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("merge2OneTif error =>" + e.toString());
		}
	}
}

到此这篇关于Java实现多个单张tif文件合并成一个多页tif文件的文章就介绍到这了,更多相关Java tif文件合并内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java内存模型知识汇总

    Java内存模型知识汇总

    本文中,有很多定义和说法,都是笔者自己理解后定义出来的。希望能够让读者可以对Java内存模型有更加清晰的认识。当然,如有偏颇,欢迎指正。
    2018-09-09
  • java追加写入txt文件的方法总结

    java追加写入txt文件的方法总结

    在本篇文章里我们给大家整理了关于java如何追加写入txt文件的方法和代码,需要的朋友们可以参考下。
    2020-02-02
  • Mybatis批量插入和批量更新失败问题

    Mybatis批量插入和批量更新失败问题

    这篇文章主要介绍了Mybatis批量插入和批量更新失败问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java实战房屋租赁网的实现流程

    Java实战房屋租赁网的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现一个房屋租赁网站,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Java多线程提交按照时间顺序获取线程结果详解流程

    Java多线程提交按照时间顺序获取线程结果详解流程

    在工作中是否存在这样的场景,多个线程提交执行,你不想全部线程执行结束了获取结果,而是有线程完成返回结果就获取消费。本文提供该场景的工具类,可以直接用哦
    2021-11-11
  • java中注解机制及其原理的详解

    java中注解机制及其原理的详解

    这篇文章主要介绍了java中注解机制及其原理的详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • SpringBoot使用jsr303校验的实现

    SpringBoot使用jsr303校验的实现

    这篇文章主要介绍了SpringBoot使用jsr303校验的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java开发基础日期类代码详解

    Java开发基础日期类代码详解

    这篇文章主要介绍了Java开发基础日期类的相关内容,代码通过日期工具类获取指定月份的星期与日期对应关系,以及获取指定月份的所有日期与星期集合等,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java中实现String字符串分割的3种方法

    Java中实现String字符串分割的3种方法

    这篇文章主要介绍了Java中实现String字符串分割的3种方法,文章底部介绍了JAVA 截取字符串的三种方法subString,StringUtils,split,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 秒懂Kotlin之Java工程师快速掌握Kotlin的技巧

    秒懂Kotlin之Java工程师快速掌握Kotlin的技巧

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源。这篇文章主要介绍了秒懂Kotlin之Java工程师快速掌握Kotlin的技巧,需要的朋友可以参考下
    2021-09-09

最新评论