java 多张jpg合成tif后避免tif文件过大的方法
这几天突然有个需求要求把之前的通过扫描仪扫出来的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文件过大的方法相关推荐
- Win10重装系统后更改用户文件夹名称的方法
一. 为什么要更改用户文件夹名称 最近笔记本电脑的Win10系统重装后,C:\Users文件夹下的用户文件夹名称默认是微软账户的前五位数字(如下图所示),而我们一般习惯用户名是带有意义的字母,所以很多 ...
- java 内存快照怎么看_jvm内存快照dump文件太大,怎么分析
1.场景 通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出. 对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策. 这时候怎么办 ...
- 解决eclipse中java项目导出成jar包后读写UTF-8文件中文乱码问题
最近遇到了一个小麻烦,就是在eclipse环境中读写UTF-8格式的txt文件时很正常,但是当导出成jar包后,通过点击来读写文件时出现了部分中文乱码问题. 解决办法: 开始时用的是FileReade ...
- CF使用TGP下载后,分卷文件损坏的解决方法
首先从游戏的列表删除游戏(安装失败出现分卷文件损坏的游戏) 然后进入游戏重新,继续找到该游戏(安装失败的游戏) 点击下载游戏!不会重新下载的,之后下载一些失败的文件,不会花费多少时间,慢慢等待即可 之 ...
- office2007新建word文档,打开后跳出转换文件对话框的解决方法
1.你先选择"纯文本"格式打开word文件. 2.最左上角有个圆圈,也就是office按钮,里面有新建.保存等功能的那个.最右下边有个"word选项" 3.然后 ...
- Java JPG转TIF文件过大的解决方案(单张解决方案,多张可看以下参考链接)
/*** 图片转tif格式** @param bytes* @return*/public static byte[] jpg2Tif(byte[] bytes) {//File file = new ...
- 电脑剪切后丢失的文件怎么恢复
剪切文件这是我们电脑操作中比较常用的,同时也很容易导致文件丢失的.特别是文件剪切后,被其他操作打断,不直接粘贴的话很容易丢失.那么如果电脑剪切后丢失的文件怎么恢复呢?遇到了先不要着急,还是有办法可以帮 ...
- 《阿里巴巴编码规范(JAVA)》学习认证考后感
image.png <阿里巴巴 Java 开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大开发者. 本手册的 ...
- java 0000 0001 0002 000a 000b_Java代码编译后的class文件
还是熟悉的味道,还是最简单的代码. // Hello.java public class Hello { public static void main(String[] args) { System ...
最新文章
- ASP.NET导出文件FileResult的使用
- Linux-SAMBA服务器的配置
- WPF combox二级联动
- Apache Shiro<=1.2.4反序列化RCE漏洞
- Android:获取存储卡路径的方式
- jQuery CSS 操作函数
- Jsoup爬虫新手一
- 62. 拆分初始化负载
- 论文笔记_S2D.10-2016-NIPS_室外单张图像的深度感知
- 快速排序C语言代码+辅助图+注释
- 连接远程服务器 远程服务器怎么连接
- Windows11常用快捷键总结(包含触控板使用技巧)
- MySQL数据库基础详解(非原创)
- 列的完整性约束——设置表字段的外键约束(FOREIGN KEY,FK)
- Android如何定制主题
- Premiere 移动式 马赛克
- iPad不断重启怎么办?
- 当编程语言都变成女孩子,你会不会喜欢她们!
- windows(server2012以上、2007以上)部署onlyoffice-documentserver
- (一)Kubernetes-kubeadm安装
热门文章
- Spring事务管理中异常回滚知识点总结
- Leetcode-数据结构-350. 两个数组的交集 II
- 仿真中的连续系统和离散系统
- 社旗一高2021高考成绩查询,2021年九师联盟:河南/山西省高三年级下学期5月联考分数线公布!...
- 软件测试外包干了4年,感觉废了..
- 按键精灵-离线打包 免会员 免登录版 打包工具
- matlab离群值算法_什么是离群值如何检测和删除它们对离群值敏感的算法
- 推荐系统三十六式——学习笔记(三)
- continue语句可以用在switch语句和3种循环语句中_必须知道的C语言知识细节:break、continue语句区别...
- RCNN,Fast RCNN, Faster RCN解析