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

相关文章

  • Mybatis传入List实现批量更新的示例代码

    Mybatis传入List实现批量更新的示例代码

    这篇文章主要介绍了Mybatis传入List实现批量更新的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 如何解决SpringBoot2.6及之后版本取消了循环依赖的支持问题

    如何解决SpringBoot2.6及之后版本取消了循环依赖的支持问题

    循环依赖指的是两个或者多个bean之间相互依赖,形成一个闭环,SpringBoot从2.6.0开始默认不允许出现Bean循环引用,解决方案包括在全局配置文件设置允许循环引用存在、在SpringApplicationBuilder添加设置允许循环引用、构造器注入
    2024-10-10
  • SpringBoot整合高德地图天气查询的全过程

    SpringBoot整合高德地图天气查询的全过程

    这篇文章主要给大家介绍了关于SpringBoot整合高德地图天气查询的相关资料,文中通过图文介绍的非常详细,对大家学习或者使用springboot具有一定的参考学习价值,需要的朋友可以参考下
    2021-12-12
  • 详解Java解析XML的四种方法

    详解Java解析XML的四种方法

    本篇文章主要介绍了java解析XML的几种方式,XML现在已经成为一种通用的数据交换格式,给数据集成与交互提供了方便,有需要的可以了解一下。
    2016-11-11
  • 详解Java 信号量Semaphore

    详解Java 信号量Semaphore

    这篇文章主要介绍了Java 信号量Semaphore的相关资料,帮助大家更好的理解和学习Java并发,感兴趣的朋友可以了解下
    2020-09-09
  • SpringBoot实现滑块验证码验证登陆校验功能详解

    SpringBoot实现滑块验证码验证登陆校验功能详解

    验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情况下,各种新型的验证码如雨后春笋般涌现,今天给大家分享一篇SpringBoot实现滑块验证码
    2022-09-09
  • Maven中optional标签用法详解

    Maven中optional标签用法详解

    这篇文章主要介绍了Maven中optional标签,文章中有详细的代码示例供大家参考,对大家的学习或工作有一定的参考价值,感兴趣的小伙伴可以借鉴一下
    2023-05-05
  • Spring Security permitAll()不允许匿名访问的操作

    Spring Security permitAll()不允许匿名访问的操作

    这篇文章主要介绍了Spring Security permitAll()不允许匿名访问的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java微信公众平台开发(8) 多媒体消息回复

    Java微信公众平台开发(8) 多媒体消息回复

    这篇文章主要为大家详细介绍了Java微信公众平台开发第八步,微信多媒体消息回复,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java后台接口开发初步实战教程

    Java后台接口开发初步实战教程

    下面小编就为大家分享一篇 Java后台接口开发初步实战教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01

最新评论