ImageIO.read 读入.tif格式图片为空的处理
前言
项目要求可以将.tif图片打印在pdf里,一般的ImageIO 不支持.tif格式的图片的,ImageIO.read 读入.tif格式的图片为空,导致Image.getInstance时报空指针异常。
1、首先的想法是将.tif转成常见的.jpg格式再进行打印
上网查了很多,看了一些文章,大体上常见的方法就是通过导入jai_codec-1.1.3.jar 和 jai_core.jar 核心包 然后再通过代码处理,但是一个很重要的问题就是,这两个包不是免费的……所以直接pass,有想法的可以去找找看有没有可以直接用的xd。
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.JPEGEncodeParam;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import java.io.*;
/**
* 将 tiff 转换 jpg 格式
* @param filePath
* @return
*/
public static String tiffTuanJPG(String filePath){
String format = filePath.substring(filePath.lastIndexOf(".")+1);
String turnJpgFile = filePath.replace("tiff", "jpg");
if(format.equals("tiff")){
File fileTiff = new File(turnJpgFile);
if(fileTiff.exists()){
System.out.println("该tiff文件已经转换为 JPG 文件:"+turnJpgFile);
return turnJpgFile;
}
RenderedOp rd = JAI.create("fileload", filePath);//读取iff文件
OutputStream ops = null;
try {
ops = new FileOutputStream(turnJpgFile);
//文件存储输出流
JPEGEncodeParam param = new JPEGEncodeParam();
ImageEncoder image = ImageCodec.createImageEncoder("JPEG", ops, param); //指定输出格式
image.encode(rd );
//解析输出流进行输出
ops.close();
System.out.println("tiff转换jpg成功:"+filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return turnJpgFile;
}
有想法的可以看看这个文章 代码转载至此:链接: java实现 tiff图片 转 JPG图片(完美解决).
2、还有就是利用工具实现或者通过代码直接实现格式转换的
这里看到过一个文章,可惜的是我的图片是http格式的地址,好像没办法用这个办法,有兴趣的可以去试试
转载:链接: Java实现tiff图片转化为jpg格式.
3、最后,既然写这个就肯定是解决了问题了
经过我多方找寻,终于发现了个省时省力的办法,让我先复制一手
在java8 及之前版本中,jdk 中的 ImageIO 读取图片内容会失败,解决办法使用 java9 或者使用第三方插件。
插件可以使用 TwelveMonkeys ImageIO,地址:https://github.com/haraldk/TwelveMonkeys
使用方法,在maven中添加依赖
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-tiff</artifactId>
<version>3.4.1</version>
</dependency>
因为 ImageIO 会自动搜索类路径下继承的接口和子类,因此不需要显示调用。完全无侵入。使用方法和之前的一样,例如,读取tiff的文件
String filename = "D:\\logs\\temp\\test.tif";
try {
BufferedImage bufferedImage = ImageIO.read(FileUtil.getInputStream(filename));
if (bufferedImage == null) {
System.out.println("image read null");
} else {
System.out.println("read success");
}
} catch (IOException e) {
e.printStackTrace();
}
转载:链接: java8 中 ImageIO 读取 tiff 格式的图片失败.
这个方法简单粗暴,加个依赖,小手一点,假如你用的就是ImageIO,那么恭喜了,你一个字的代码都不用改,拿来就能用,反正我已经冲过了。