1. 程式人生 > >Java實現圖片(jpg/png)轉成TIF格式(300dpi)踩坑筆記

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資源被佔用無法刪除問題;解決辦法:見上面工具類