Java tif多页文件转jpg问题,Decoding of old style JPEG-in-TIFF data is not supported问题
来源:互联网 发布:amf数据分析器下载 编辑:程序博客网 时间:2024/05/17 10:08
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); // Intel System.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 reader ImageReader 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 file int 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();}}}
阅读全文
1 0
- Java tif多页文件转jpg问题,Decoding of old style JPEG-in-TIFF data is not supported问题
- old style JPEG-in-TIFF 格式转换
- TypeError: decoding Unicode is not supported
- TypeError: decoding Unicode is not supported
- python 转码报错decoding Unicode is not supported
- 利用jpedal进行pdf转换成jpeg,jpg,png,tiff,tif等格式的图片
- 利用jpedal进行pdf转换成jpeg,jpg,png,tiff,tif等格式的图片
- Project facet Java 6.0 is not supported的问题
- Project facet Java 6.0 is not supported的问题
- Xml data type is not supported in distributed queries.
- jpg和tif转pdf遇到的问题和解决方法
- -fembed-bitcode is not supported on versions of iOS prior to 6.0 问题修复
- -fembed-bitcode is not supported on versions of iOS prior to 6.0 问题修复
- -fembed-bitcode is not supported on versions of iOS prior to 6.0问题
- selenium问题:Link has target '_blank', which is not supported in Selenium!
- iOS iOS8中 问题"registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later" 解决方案
- iOS 推送问题 registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later
- iOS iOS8中 问题"registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later" 解决方案
- Xshell ssh 长时间不掉线设置
- mysql负载均衡(mariadb+haporxy)
- batch normalization论文
- 串口读取数据
- android开源系列:CircleImageView自定义圆形控件的使用
- Java tif多页文件转jpg问题,Decoding of old style JPEG-in-TIFF data is not supported问题
- 安卓7.0的适配---uri更改和安装apk
- (笔记)第二章 :先从看到的入手-探究活动
- Linux Wireless架构总结
- NanoPi—M1(H3)———基于该平台的一个内核中的按键中断程序开发历程
- Andriod下拉刷新(适配常用样式动画)
- YOLO模型test计算流程
- php禁止客户端访问目录文件
- ubuntu无图形界面,只有壁纸