Java實現圖片(jpg/png)轉成TIF格式(300dpi)踩坑筆記
阿新 • • 發佈:2018-12-10
一、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; }
四、踩坑點
- jar包難找,到處都收費;解決辦法:見本文底部
- 8位深度的圖片會出現檔案損壞問題;解決辦法:中轉一次,統一轉成24位深度的JPG圖片
- 在下載TIF圖片後無法刪除產生的臨時檔案,RenderedOp資源被佔用無法刪除問題;解決辦法:見上面工具類