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资源被占用无法删除问题;解决办法:见上面工具类

github地址:图片转TIFF格式工具类源码及jar包

你可能感兴趣的:(Java实现图片(jpg/png)转成TIF格式(300dpi)踩坑笔记)