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,那么恭喜了,你一个字的代码都不用改,拿来就能用,反正我已经冲过了。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值