这几天突然有个需求要求把之前的通过扫描仪扫出来的jpg图片给合成一个tif文件,乍一看这个需求还是没啥问题的,于是乎直接上网找一个方法下来就好啦,百度“多张jpg合成tif”得到如下方法:

 /*** 合并成一个tif* @param bookFilePaths 要合并的图片集合,字符串为图片的全路径* @param toPath 目的文件夹路径* @param distFileName 合成的文件名(带后缀)*/public static void many2one(List<String> bookFilePaths, String toPath, String distFileName) {if (bookFilePaths != null && bookFilePaths.size() > 0) {File[] files = new File[bookFilePaths.size()];for (int i = 0; i < bookFilePaths.size(); i++) {files[i] = new File(bookFilePaths.get(i));}if (files != null && files.length > 0) {try {ArrayList pages = new ArrayList(files.length - 1);FileSeekableStream[] stream = new FileSeekableStream[files.length];for (int i = 0; i < files.length; i++) {stream[i] = new FileSeekableStream(files[i].getPath());}ParameterBlock pb = (new ParameterBlock());PlanarImage firstPage = JAI.create("stream", stream[0]);for (int i = 1; i < files.length; i++) {PlanarImage page = JAI.create("stream", stream[i]);pages.add(page);}TIFFEncodeParam param = new TIFFEncodeParam();File f = new File(toPath);if (!f.exists()) {f.mkdirs();}OutputStream os = new FileOutputStream(toPath + File.separator + distFileName);ImageEncoder enc = ImageCodec.createImageEncoder("tiff", os, param);param.setExtraImages(pages.iterator());enc.encode(firstPage);for (int i = 0; i < files.length; i++) {stream[i].close();if (files[i].isFile() && files[i].exists()) {files[i].delete();}}os.close();} catch (IOException e) {e.printStackTrace();}}}}

参数意义明确,感觉胜利就在眼前,迅速把图片放上去试一下,结果发现30张300K左右的jpg图片合成完之后却有340M!这个是肯定不接受的。上网找了一个软件来合成这30张jpg大小为9M,与30张的大小之和基本一致。

想了以下几个办法解决:

1.直接压缩340M的tif

2.先压缩jpg再合成tif

3.先把30张jpg转为pdf再转tif

4.重新review方法找原因

第一种方法压缩之后离要求的大小还是相差很大;第二种先压缩再合成也是这样,而且还改变了原jpg的dpi,这种方案也是不行;第三种方案,pdf转tif有问题,不是对于中文pdf支持有问题就是转不出多页tif,也pass;最后一种方案,好好研究了一下TIFFEncodeParam,TIFFField这两个类,先贴成功之后的代码

 public static void many2one(List<String> bookFilePaths, String toPath, String distFileName) {if (bookFilePaths != null && bookFilePaths.size() > 0) {File[] files = new File[bookFilePaths.size()];for (int i = 0; i < bookFilePaths.size(); i++) {files[i] = new File(bookFilePaths.get(i));}if (files != null && files.length > 0) {try {ArrayList pages = new ArrayList(files.length - 1);FileSeekableStream[] stream = new FileSeekableStream[files.length];for (int i = 0; i < files.length; i++) {stream[i] = new FileSeekableStream(files[i].getCanonicalPath());}ParameterBlock pb = (new ParameterBlock());PlanarImage firstPage = JAI.create("stream", stream[0]);for (int i = 1; i < files.length; i++) {PlanarImage page = JAI.create("stream", stream[i]);pages.add(page);}TIFFEncodeParam param = new TIFFEncodeParam();param.setCompression(TIFFEncodeParam.COMPRESSION_JPEG_TTN2);
//                  param.setCompression(TIFFEncodeParam.COMPRESSION_DEFLATE);
//                  param.setDeflateLevel(9);
//                  param.setWriteTiled(true);
//                  param.setReverseFillOrder(true);TIFFField[] extras = new TIFFField[4];extras[0] = new TIFFField(262, TIFFField.TIFF_SHORT, 1, (Object) new short[] { 6 });extras[1] = new TIFFField(282, TIFFTag.TIFF_RATIONAL, 1, (Object) new long[][]{{(long) 200, 1}, {0, 0}});  extras[2] = new TIFFField(283, TIFFTag.TIFF_RATIONAL, 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);param.setExtraImages(pages.iterator());File f = new File(toPath);if (!f.exists()) {f.mkdirs();}OutputStream os = new FileOutputStream(toPath + File.separator + distFileName);ImageEncoder enc = ImageCodec.createImageEncoder("tiff", os, param);enc.encode(firstPage);os.close();System.out.println("over");} catch (IOException e) {e.printStackTrace();}}}}

TIFFEncodeParam类

https://docs.oracle.com/cd/E17802_01/products/products/java-media/jai/forDevelopers/jai-apidocs/com/sun/media/jai/codec/TIFFEncodeParam.html#COMPRESSION_DEFLATE

这几种可以理解成是合成tif时候的方式

下面是tiff6.0的格式简介

http://www.codeweblog.com/tiff6-0%E6%A0%BC%E5%BC%8F%E7%AE%80%E4%BB%8B/

这之后的部分很重要,各位可以根据自己的需求选择搭配的属性。这个地方他说的这些属性指的就是tif图片的属性,要在TIFFField这里设置,这也就是我上面提到的第二个类。

https://www.awaresystems.be/imaging/tiff/tifftags/baseline.html

这里面就是可以设置的参数,表中的DEC就是上面代码中的258,262,282,283这些。至于第二、四个参数应该填什么还是要上tiff6.0的格式简介里面去查,查到的类型去这里匹配

把构造方法的几个参数填上之后,赶紧试一下效果。合成的图片就只有9M多了。但是还有个问题就是等待的时间很长,30张图片要2分钟,这个问题还需要以后有时间解决~

还有一篇文章也有用到,放在下边,自取

http://www.libtiff.org/support.html

java 多张jpg合成tif后避免tif文件过大的方法相关推荐

  1. Win10重装系统后更改用户文件夹名称的方法

    一. 为什么要更改用户文件夹名称 最近笔记本电脑的Win10系统重装后,C:\Users文件夹下的用户文件夹名称默认是微软账户的前五位数字(如下图所示),而我们一般习惯用户名是带有意义的字母,所以很多 ...

  2. java 内存快照怎么看_jvm内存快照dump文件太大,怎么分析

    1.场景 通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出. 对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策. 这时候怎么办 ...

  3. 解决eclipse中java项目导出成jar包后读写UTF-8文件中文乱码问题

    最近遇到了一个小麻烦,就是在eclipse环境中读写UTF-8格式的txt文件时很正常,但是当导出成jar包后,通过点击来读写文件时出现了部分中文乱码问题. 解决办法: 开始时用的是FileReade ...

  4. CF使用TGP下载后,分卷文件损坏的解决方法

    首先从游戏的列表删除游戏(安装失败出现分卷文件损坏的游戏) 然后进入游戏重新,继续找到该游戏(安装失败的游戏) 点击下载游戏!不会重新下载的,之后下载一些失败的文件,不会花费多少时间,慢慢等待即可 之 ...

  5. office2007新建word文档,打开后跳出转换文件对话框的解决方法

    1.你先选择"纯文本"格式打开word文件. 2.最左上角有个圆圈,也就是office按钮,里面有新建.保存等功能的那个.最右下边有个"word选项" 3.然后 ...

  6. Java JPG转TIF文件过大的解决方案(单张解决方案,多张可看以下参考链接)

    /*** 图片转tif格式** @param bytes* @return*/public static byte[] jpg2Tif(byte[] bytes) {//File file = new ...

  7. 电脑剪切后丢失的文件怎么恢复

    剪切文件这是我们电脑操作中比较常用的,同时也很容易导致文件丢失的.特别是文件剪切后,被其他操作打断,不直接粘贴的话很容易丢失.那么如果电脑剪切后丢失的文件怎么恢复呢?遇到了先不要着急,还是有办法可以帮 ...

  8. 《阿里巴巴编码规范(JAVA)》学习认证考后感

    image.png <阿里巴巴 Java 开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大开发者. 本手册的 ...

  9. java 0000 0001 0002 000a 000b_Java代码编译后的class文件

    还是熟悉的味道,还是最简单的代码. // Hello.java public class Hello { public static void main(String[] args) { System ...

最新文章

  1. ASP.NET导出文件FileResult的使用
  2. Linux-SAMBA服务器的配置
  3. WPF combox二级联动
  4. Apache Shiro<=1.2.4反序列化RCE漏洞
  5. Android:获取存储卡路径的方式
  6. jQuery CSS 操作函数
  7. Jsoup爬虫新手一
  8. 62. 拆分初始化负载
  9. 论文笔记_S2D.10-2016-NIPS_室外单张图像的深度感知
  10. 快速排序C语言代码+辅助图+注释
  11. 连接远程服务器 远程服务器怎么连接
  12. Windows11常用快捷键总结(包含触控板使用技巧)
  13. MySQL数据库基础详解(非原创)
  14. 列的完整性约束——设置表字段的外键约束(FOREIGN KEY,FK)
  15. Android如何定制主题
  16. Premiere 移动式 马赛克
  17. iPad不断重启怎么办?
  18. 当编程语言都变成女孩子,你会不会喜欢她们!
  19. windows(server2012以上、2007以上)部署onlyoffice-documentserver
  20. (一)Kubernetes-kubeadm安装

热门文章

  1. Spring事务管理中异常回滚知识点总结
  2. Leetcode-数据结构-350. 两个数组的交集 II
  3. 仿真中的连续系统和离散系统
  4. 社旗一高2021高考成绩查询,2021年九师联盟:河南/山西省高三年级下学期5月联考分数线公布!...
  5. 软件测试外包干了4年,感觉废了..
  6. 按键精灵-离线打包 免会员 免登录版 打包工具
  7. matlab离群值算法_什么是离群值如何检测和删除它们对离群值敏感的算法
  8. 推荐系统三十六式——学习笔记(三)
  9. continue语句可以用在switch语句和3种循环语句中_必须知道的C语言知识细节:break、continue语句区别...
  10. RCNN,Fast RCNN, Faster RCN解析