Java实现图片(jpg/png)转成TIF格式(300dpi)踩坑笔记

一、TIF/TIFF介绍 引用百度百科的一句话总结:

标签图像文件格式(Tag Image File Format,简写为TIFF)是一种灵活的位图格式,主要用来存储包括照片和艺术图在内的图像。
二、转换TIF所需要的jar包 需要3个jar包:
jai_core-1.1.3.jar
jai_imageio.jar
jai-codec-1.1.3.jar
下载地址请见文章在最底部。
三、使用Java转成TIF格式的工具类 3.1 工具类介绍: 传入文件的绝对路径,返回的是一个TIF格式dpi为300的图片路径,dpi可以自己设置值。
其中有遇到图片位深度为8位的图片无法转换,所以多加了一个filterFilePath,用于过滤一次,统一转换成位深度为24的JPG图片,然后再进行TIF编码。
3.2 工具类如下:
/** * * 功能描述: 图片转tif格式 * * @param: [fileAbsolutePath] * @return: java.lang.String转成TIF图片的地址全路径 * @auther: KevinZc * @date: 2018/9/8 22:14 */ public String image2Tif(String fileAbsolutePath){ OutputStream outputStream = null; String filterFilePath = null; String tifFilePath = null; ImageOutputStream ios = null; try { // 解决位深度太小 start ====注意:8位深度的图片会出现文件损坏问题 File picture = new File(fileAbsolutePath); // 统一进行一次过滤 转换成24位深度 filterFilePath = fileAbsolutePath.substring(0, fileAbsolutePath.lastIndexOf("."))+".JPG"; tifFilePath = filterFilePath.substring(0, filterFilePath.lastIndexOf("."))+".tif"; ios = ImageIO.createImageOutputStream(new File(filterFilePath)); ImageIO.write(ImageIO.read(picture),"JPG", ios); // 解决位深度太小 end FileSeekableStream stream = new FileSeekableStream(filterFilePath); PlanarImage in = JAI.create("stream", stream); OutputStream os = null; os = new FileOutputStream(tifFilePath); // 设置dpi为300 TIFFEncodeParam param = new TIFFEncodeParam(); param.setCompression(TIFFEncodeParam.COMPRESSION_NONE); TIFFField[] extras = new TIFFField[2]; extras[0] = new TIFFField(282, TIFFTag.TIFF_RATIONAL, 1, (Object) new long[][]{{(long) 300, 1}, {0, 0}}); //extras[0] = new TIFFField(282, TIFFTag.TIFF_RATIONAL, 1, (Object) new long[][]{{(long) dpi, 1}, {0, 0}}); extras[1] = new TIFFField(283, TIFFTag.TIFF_RATIONAL, 1, (Object) new long[][]{{(long) 300, 1}, {0, 0}}); param.setExtraFields(extras); TIFFImageEncoder enc = new TIFFImageEncoder(os, param); try { enc.encode(in); os.flush(); os.close(); stream.close(); } catch (Exception e) { logger.error("{}",e ); throw new RuntimeException(e); } return tifFilePath; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (outputStream != null) { outputStream.close(); } if (ios != null) { ios.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; }

四、踩坑点
  1. jar包难找,到处都收费;解决办法:见本文底部
  2. 8位深度的图片会出现文件损坏问题;解决办法:中转一次,统一转成24位深度的JPG图片
  3. 在下载TIF图片后无法删除产生的临时文件,RenderedOp资源被占用无法删除问题;解决办法:见上面工具类
【Java实现图片(jpg/png)转成TIF格式(300dpi)踩坑笔记】github地址:图片转TIFF格式工具类源码及jar包

    推荐阅读