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文件合并内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Socket类以及ServerSocket类的实例讲解

    基于Socket类以及ServerSocket类的实例讲解

    下面小编就为大家带来一篇基于Socket类以及ServerSocket类的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • JAVA Log 日志级别和使用配置示例

    JAVA Log 日志级别和使用配置示例

    本文介绍了Java中主流的日志框架,包括Logback和Log4j2,并详细解释了日志级别及其使用场景,同时,还提供了配置示例和使用技巧,如正确的日志记录方式、异常日志记录、性能优化以及环境特定的日志配置,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-11-11
  • Nacos通过RefreshScope实现配置自动更新的方式分享

    Nacos通过RefreshScope实现配置自动更新的方式分享

    这篇文章主要给大家介绍了Nacos如何通过RefreshScope实现配置自动更新,文中给了两种实现方式供大家参考,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-09-09
  • 基于java Springboot实现教务管理系统详解

    基于java Springboot实现教务管理系统详解

    这篇文章主要介绍了Java 实现简易教务管理系统的代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 详解MyBatis动态代理机制

    详解MyBatis动态代理机制

    MyBatis的动态代理机制是其核心特性之一,通过该机制,开发者可以专注于定义接口和 SQL 映射,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • Maven解决jar包版本冲突的4种方法详解

    Maven解决jar包版本冲突的4种方法详解

    这篇文章主要给大家介绍了关于Maven解决jar包版本冲突的4种方法代码,maven工程要导入jar包的坐标,就必须要考虑解决jar包冲突,文中介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • SpringBoot连接Redis集群教程

    SpringBoot连接Redis集群教程

    这篇文章主要介绍了SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • SpringBoot整合Security实现权限控制框架(案例详解)

    SpringBoot整合Security实现权限控制框架(案例详解)

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框,是一个重量级的安全管理框架,本文给大家介绍的非常详细,需要的朋友参考下吧
    2021-08-08
  • springboot集成spring cache缓存示例代码

    springboot集成spring cache缓存示例代码

    本篇文章主要介绍了springboot集成spring cache示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java的分片上传功能的实现

    Java的分片上传功能的实现

    本文主要介绍了Java的分片上传功能的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论