Tiff文件转jpg图片有多种做法,网上大多数是采用java的JAI,其实还可以采用jdk自带的imageio进行解析转换。
方法一:
采用JAI
首先需要引入JAI的jar包,有:jai_codec.jar,jai_core.jar
具体实现方法:

一、Tiff文件转换为单张图片

 RenderedOp src2 = JAI.create("fileload", “./file.tif”);//读取tiff文件OutputStream os2 = new FileOutputStream(path+"/test/fk.jpg"); //文件存储输出流JPEGEncodeParam param = new JPEGEncodeParam();ImageEncoder enc2 = ImageCodec.createImageEncoder("JPEG", os2, param); //指定输出格式enc2.encode(src2 );//解析输出流进行输出os2.close();
二、tiff多页文件转为多张图片
import java.awt.image.RenderedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.File;
import java.io.IOException;import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.JPEGEncodeParam;
import com.sun.media.jai.codec.TIFFDecodeParam;
import com.sun.media.jai.codec.TIFFEncodeParam;public class TestTiffToJPEG {public static void main(String[] args){tiffToJPEG("F:\\Workspace\\exoa\\oadoc\\test\\tiffile\\testfile.tif");}public static void tiffToJPEG(String tiff){FileSeekableStream ss = null;try {ss = new FileSeekableStream(tiff);//以流形式取出tif文件数据} catch (IOException e) {System.out.println("Exception in " + tiff + " " + e.getMessage());e.printStackTrace();}String path,tiffName;path = tiff.substring(0, tiff.lastIndexOf("."));tiffName = tiff.substring(tiff.lastIndexOf("\\"),tiff.lastIndexOf("."));TIFFDecodeParam param0 = null;TIFFEncodeParam param = new TIFFEncodeParam();JPEGEncodeParam param1 = new JPEGEncodeParam();if(ss!=null){ImageDecoder dec = ImageCodec.createImageDecoder("tiff", ss, param0);//将tif文件流转为image图片int count = 0;try {count = dec.getNumPages();//tif文件页数} catch (IOException e) {System.out.println("Exception in dec.getNumPages() " + e.getMessage());e.printStackTrace();}param.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4);param.setLittleEndian(false); // IntelSystem.out.println("This TIF has " + count + " image(s)");for (int i = 0; i < count; i++) {//存储为jpeg图片RenderedImage page = null;File f = new File(path,"\\"+tiffName+"_" + i + ".jpg");try {page = dec.decodeAsRenderedImage(i);//取出第i张image图片if(!f.exists()){f.getParentFile().mkdirs();f.createNewFile();}} catch (IOException e) {System.out.println("Exception in File f or dec.decodeAsRenderedImage(i)" + e.getMessage());e.printStackTrace();}if(f.exists() && page != null){//压缩图片并保存为JPEG格式ParameterBlock pb = new ParameterBlock();pb.addSource(page);pb.add(f.toString());pb.add("JPEG");pb.add(param1);RenderedOp r = JAI.create("filestore",pb);r.dispose();}}}}
}
以上为java的JAI对tif文件处理为jpg图片,可适用于大部分tif文件,但若是由doc文件转换过来的tif文件,在解析图片时会出现下标越界异常,只能用于针对扫描出来的tif扫描件。
注:java的JAI暂时还不支持对旧式JPEG-in-TIFF数据的解码,也就是,部分tif文件执行此段代码进行解析时,会报异常:Decoding of old style JPEG-in-TIFF data is not supported
为了解决这个问题,本人在网上大幅度搜罗,发现可以采取另一种方法对tif进行解析转换。
采用JDK自带的imageio对tif进行转换,此种方法不仅可以适应旧式JPEG-in-TIFF数据,需引用jai-imageio-core-1.3.1.jar,实现方式也相对于上两种简洁,具体实现如下
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;public class TiffToJPEGByImageIO {public static void main(String[] args){tiffToJPEGByImageIO("F:\\Workspace\\exoa\\oadoc\\test\\tiffile\\1.tif");}private static void tiffToJPEGByImageIO(String tiff) {ImageInputStream input;try {input = ImageIO.createImageInputStream(new File(tiff));//以图片输入流形式读取到tif// Get the readerImageReader reader = ImageIO.getImageReaders(input).next();//获得image阅读器,阅读对象为tif文件转换的流String path,tiffName;path = tiff.substring(0, tiff.lastIndexOf("."));tiffName = tiff.substring(tiff.lastIndexOf("\\"),tiff.lastIndexOf("."));try {reader.setInput(input);// Read page 2 of the TIFF fileint count = reader.getNumImages(true);//tif文件页数//System.out.println(count);for(int i = 0; i < count; i++){BufferedImage image = reader.read(i, null);//取得第i页File f = new File(path,"\\"+tiffName+"_"+i+".jpg");try {if(!f.exists()){f.getParentFile().mkdirs();f.createNewFile();}} catch (IOException e) {e.printStackTrace();}ImageIO.write(image, "JPEG", f);//保存图片}}finally {reader.dispose();input.close();}}catch (IOException e) {e.printStackTrace();}}
}

Java tif多页文件转jpg问题,Decoding of old style JPEG-in-TIFF data is not supported问题相关推荐

  1. java pdf 多页转换为png格式的图片

    java pdf 多页转换为png格式的图片  适用于 无论pdf有多少页均可 废话不说,直接上代码 import java.awt.Graphics; import java.awt.image.B ...

  2. 关于Java中对于jsp文件的浅认识

    jsp文件可以作为java的模板页面?yes! 前端写好的HTML静态文件,后台的Java人员可以改为jsp文件,从而作为模板页面进行嵌套. 在项目中,或多或少的和java工程师有过一定的技术交流,发 ...

  3. 【java】java中内存映射文件和IO

    转载:https://leokongwq.github.io/2017/02/25/java-memorymapped-file-and-io.html 对大多数Java开发人员来说,Java中的内存 ...

  4. java工具类获取文件扩展名与content-type、http与content-type映射关系

    java工具类获取文件扩展名与content-type.http与content-type映射关系 大家好,我是酷酷的韩~ 一.对应关系参考地址: http://doc.chacuo.net/cont ...

  5. java实现对pdf文件压缩,拆分,修改水印,添加水印

    最近要实现一个文件上传,并且在线预览上传文件的功能,设计思路是:把上传的文件通过openoffice转成pdf文件,并将pdf文件以流的形式返回到浏览器,由于上传的部分文件过大,转成pdf后传回前端浏 ...

  6. java实现给PDF文件添加图片水印,java实现给PDF文件添加文字水印

    接上一篇,pdf跟tif 是一起做的 java实现 1.给PDF文件添加图片水印: public static void waterMark1(String inputFile,String outp ...

  7. Java分页导出Excel文件

    Java分页导出Excel文件 1.开发微信小程序接入广告获取收益 技术: Springboot + mongodb + maven +Layui + thymeleaf 上一篇博客已经讲解了Java ...

  8. 【Java】操作doc文件

    读取txt文件 在Java里要对文件进行操作,需要用到IO流. public static void main(String args[]){File f = new File("test. ...

  9. Java实现给PDF文件加文字水印和图片水印(可以自定义水印格式)

    使用Java代码给PDF文件加文字水印 直接上代码运行即可 依赖 有的可能用不上我直接复制全部了 <dependencies><!--word文件转PDF以及水印-->< ...

最新文章

  1. 汽车行业如何个性化定制转型?看APS系统在这家企业的运用
  2. mysql索引底层图_MySQL索引底层数据结构
  3. 华为推出业界首个分布式云原生产品:华为云UCS,持续创新,深耕数字化
  4. 【9.4】socket模拟http请求
  5. 基于asp.net sql社区物业管理系统毕业设计网站
  6. Python Parse JSON –转储,加载
  7. 计算机高级技师论文网,高级技师论文(数控铣床、加工中心).doc
  8. layui的tree如何实现动态加载_layui tree动态加载 利用CAReplicatorLayer实现的加载动画 - 电脑常识 - 服务器之家...
  9. 如何吧家庭网络从计算机去掉,3个简单电脑、路由器设置,迅速解决网络瓶颈提高家庭网络速度...
  10. Pouch Container与Kubernetes相比效率如何?
  11. jsp后台页面登录html代码,炫酷的登录jsp页面完整代码
  12. python 比对两个excel表数据_python 如何快速找出两个电子表中数据的差异
  13. java实验计算机与光盘,JAVA实验指导资料.docx
  14. eda技术试卷_EDA技术试题库-试题库
  15. mysql 日文乱码_Mysql 导入日文数据乱码问题
  16. python之excel编程
  17. 不管她是否调皮、不管她成绩是否优秀、也不管她是否迷恋游戏,只想她能睁开眼睛。
  18. java合并单元格边框不完整,java poi 合并单元格后边框问题
  19. 透过脉脉的新闻“线”场看职场
  20. 情人节程序员用HTML网页表白【情人相册模板】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript

热门文章

  1. python的dropna函数_Pandas dropna()函数不工作
  2. golang环境安装
  3. 营销型新媒体运营者的必备能力
  4. 在微信小游戏中使用three.js显示3D图形
  5. 初阶算法工程师的工作感悟
  6. 梦想——要勇于追求,安逸——只能让你迷失
  7. pythonjson中list操作_Python中json的简单读写操作
  8. apio2018划水记
  9. 皮肤电数据简介及预处理指南
  10. 世界第一个Bug的诞生,为什么软件缺陷叫BugDefect?