近期项目需要在前端展示 tif 格式的图片,测试发现只有在 ie9以上浏览器及苹果的 Safari 浏览器上能自带支持查看 tif 图片,然而最常用的 Google Chrome浏览器上并不能正常显示。

查了各种资料后自己写了一份实现,欢迎借鉴。

public class TifFile extends FileProcess {@Overridepublic byte[] tif2JPG(byte[] buffer, InputStream inputStream, String outputFilePath) throws Exception {if(buffer==null||buffer.length==0) return null;byte[] byt = null;String jpgOutFilePath = outputFilePath.replaceAll(".tif", ".jpg");File jpgFile = new File(jpgOutFilePath);if (jpgFile.exists()) {InputStream input = new FileInputStream(jpgFile);byt = new byte[input.available()];input.read(byt);input.close();return byt;}BufferedImage bufferedImage = ImageIO.read(inputStream);  // 指定写图片的方式为 jpg  ImageWriter imgWrier = ImageIO.getImageWritersByFormatName("jpeg").next(); ImageWriteParam imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null);  // 要使用压缩,必须指定压缩方式为MODE_EXPLICIT  imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT);// 这里指定压缩的程度,参数qality是取值0~1范围内,  imgWriteParams.setCompressionQuality(0.5f);  imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);  ColorModel colorModel = ColorModel.getRGBdefault();// 指定压缩时使用的色彩模式  imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel, colorModel  .createCompatibleSampleModel(16, 16))); ByteArrayOutputStream bos = new ByteArrayOutputStream(buffer.length); imgWrier.reset();  // 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何 OutputStream构造  imgWrier.setOutput(ImageIO.createImageOutputStream(bos));  // 调用write方法,就可以向输入流写图片  imgWrier.write(null, new IIOImage(bufferedImage, null, null), imgWriteParams); bos.flush();  bos.close();  inputStream.close();  byte[] result = bos.toByteArray();outputStreamFile(result,jpgFile);return result; }public void outputStreamFile(byte[] buffer,File file) throws Exception {OutputStream os = new FileOutputStream(file);os.write(buffer);os.close();}
}
public class FileProcessUtils {public static byte[] convertToJPG(Class<?> clazz, byte[] buffer,InputStream inputStream,String outFilePath,String extension) {  byte[] byt = null;try {  FileProcess file =  (FileProcess) Class.forName(clazz.getName()).newInstance();  if("tif".equals(extension)) {byt =  file.tif2JPG(buffer, inputStream, outFilePath);}} catch (Exception e) {System.out.println(e.getMessage());}  return byt;} public static void main(String[] args) throws Exception {FileInputStream fis = new FileInputStream("/Users/HJK/Downloads/abcdef.tif");byte[] buffer = new byte[fis.available()];fis.read(buffer);InputStream inputStream = new ByteArrayInputStream(buffer);convertToJPG(TifFile.class,buffer, inputStream, "/Users/HJK/Downloads/abcdef.jpg","tif");}
}

画个重点,这里需要用到 jai-imageio-core 这个包,如果缺少这个包会导致

BufferedImage bufferedImage = ImageIO.read(inputStream);  

读取的 BufferedImage 是个空对象,后边会出现参数异常。具体原因因为项目时间紧,暂时没有深入研究,猜测应该是jai-imageio的作者对 ImageIO 做了一些读取 tif 的完善。

Java tif转jpg代码实现相关推荐

  1. 统计java文件中的代码行数

    统计Java代码行数工具类  --  CodeCounterUtil.java 统计指定目录下的java文件中代码行数  --  public static int  getCodeNumFromFo ...

  2. java主窗体设计代码_java窗体设计+GUI经典代码全放送

    [实例简介] java窗体设计经典代码,手把手叫你如何设计java窗体,编写应用程序. [实例截图] [核心代码] 57641e3b-d82c-4f28-bb29-35f951c1158d └── j ...

  3. java精确除法计算,四舍五入 Java问题通用解决代码

    java精确除法计算,四舍五入 Java问题通用解决代码 参考文章: (1)java精确除法计算,四舍五入 Java问题通用解决代码 (2)https://www.cnblogs.com/svenne ...

  4. python代码转成java_如何实现Java代码转换成python代码

    之前小编告诉大家最初是学Java的,现在转向python,那对于两者之间有什么互通的嘛?其实有,比如可以将Java转成python代码,一起来看下吧. 首先给大家带来一组示例演示. Java代码如下: ...

  5. 区块链 java 开源_详细介绍Java区块链开源代码背后的内容

    什么是Java区块链开源代码?它是一种分布式分类帐技术,将所有不同的属性放在一起.那么Java区块链开源代码就可以通过不同的共识机制,使所有添加的数据不变.2015年之前,估计大家都知道的区块链的申请 ...

  6. Java IOUtils.copy方法代码示例(亲测)

    本文整理汇总了Java中org.apache.commons.io.IOUtils.copy方法的典型用法代码示例.如果您正苦于以下问题:Java IOUtils.copy方法的具体用法?Java I ...

  7. java 委托机制_通过反射实现Java下的委托机制代码详解

    简述 一直对Java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块API public Class Delegater()//空参构造,该类管理委托实例并 ...

  8. java学习教程之代码块

    学编程吧java学习教程之代码块发布了,欢迎通过xuebiancheng8.com来访问 java中的代码块包括下面几种: 1.普通代码块 2.构造代码块 3.静态代码块 1.普通代码块很简单看下面这 ...

  9. java委托机制教程_通过反射实现Java下的委托机制代码详解

    简述 一直对java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块api public class delegater()//空参构造,该类管理委托实例并 ...

  10. 在java中写出html代码,在java里写html代码

    在java里写html代码 [2021-02-09 07:31:38]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...

最新文章

  1. codevs——2894 Txx考试(背包)
  2. group by 查找订单的最新状态 join
  3. 连接Oracle错误:800a0e7a未找到提供程序的解决
  4. 前端智能化的加速时刻:华为机器视觉的创新方程式
  5. Android AIDL示例-回调方法版
  6. 9273:PKU2506Tiling
  7. 【新媒体】现阶段新闻聚合的玩法
  8. 从零开始学Pytorch之数据操作
  9. 【HTML+CSS网页设计与布局 从入门到精通】第15章-表格格式:边距/居中/边框/折叠
  10. es6 数组找最大值_JavaScript(es6)数组常用的方法
  11. 【报告分享】与AI共进,智胜未来:智能金融联合报告-埃森哲百度.pdf
  12. 浅析libuv源码-获取精确时间
  13. java分割txt文件
  14. vant修改用户头像
  15. golang模拟抢票
  16. 13.爬虫训练场集成文件采集案例,来学习一下怎么实现的
  17. 三菱模拟量fx3u4da_FX3U-4DA使用案例三菱FX3U-4DA用户手册(模拟量控制篇) - 广州正凌...
  18. python爬虫精进参考答案_高校邦数据科学创新通识课【Python爬虫】课后习题答案...
  19. [转]彻底卸载SQL Server2014数据库(也适用于SqlServer2012)
  20. 中联软通企业短信中心 瑞星杀毒软件升级包

热门文章

  1. android发现u盘自动安装apk,安卓自动识别U盘中APK文件并进行安装操作
  2. php代码实现微信代扣,html5+如何通过native.js实现APP微信支付代扣签约?
  3. 如何扩大计算机的硬盘空间,c盘分区小了怎么扩大_电脑c盘分区空间太小如何扩大...
  4. 洛谷 P1878 舞蹈课(优先队列 + 双链表)
  5. 拥抱“互联网+”,开拓渠道发展新业态
  6. 移动硬盘备份linux系统盘,Ubuntu 系统备份到移动硬盘(tar) 还原到另一台电脑
  7. jd页面与tianmao页面模仿jsonp跨域
  8. luogu p4556 [Vani有约会]雨天的尾巴 树上差分,最近公共祖先,线段树合并
  9. 光线追踪渲染技术能听懂的介绍
  10. 吉几三的俺ら东京さ行ぐだ歌词