2013-03-15 138 views
7

最近我現在面臨的問題時,試圖顯示圖像文件。不幸的是,圖像格式是主流網頁瀏覽器不支持的TIFF格式(因爲我知道Safari只支持這種格式)。由於某些限制,我必須將此格式轉換爲其他主要瀏覽器支持的格式。但是,當我嘗試轉換格式時,它給我帶來了很多問題。如何TIFF轉換成JPEG/PNG在Java中

我不得不通過網絡搜索雖然有被張貼類似的問題,在這個環節上How do I convert a TIF to PNG in Java?「但我不能有結果,因爲它提出了..

因此,我再次提出這個問題,希望能有從大家更好的解釋和指導..

有在與提出的解決方案經過什麼時候遇上幾個問題:

1)根據該提議喬納森·範伯格答案,它需要安裝JAI和JAI/Im ageIO。 但是,我安裝了兩個人後,我仍然無法在Netbean 7.2導入文件。 NetBean 7.2仍然建議導入默認的imageIO庫。

2)當我使用默認的ImageIO圖書館閱讀方法,它將返回NULL值,我無法繼續進行。

3)我還嘗試了其他方法,例如使用BufferedOutputStream方法將TIFF文件轉換爲BIN文件,但結果文件大於11 MB,該文件太大而無法加載並最終加載失敗。

if (this.selectedDO != null) { 
     String tempDO = this.selectedDO.DONo; 
     String inPath = "J:\\" + tempDO + ".TIF"; 
     String otPath = "J:\\" + tempDO + ".bin"; 

     File opFile = new File(otPath); 

     File inFile = new File(inPath); 

     BufferedInputStream input = null; 
     BufferedOutputStream output = null; 
     try { 
      input = new BufferedInputStream(new FileInputStream(inPath), DEFAULT_BUFFER_SIZE); 
      output = new BufferedOutputStream(new FileOutputStream(otPath), DEFAULT_BUFFER_SIZE); 

      byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
      int length; 
      while ((length = input.read(buffer)) > 0) { 
       output.write(buffer, 0, length); 
      } 

     } finally { 
      try { 
       output.flush(); 
       output.close(); 
       input.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

因此,希望能得到幫助和大家指教,使我可以TIFF格式轉換爲其他格式,如JPEG/PNG。

+0

德看看ImageMagic(http://www.imagemagick.org/script/index.php)。這裏是ImageMagic的java intrface(http://www.jmagick.org/index.html) – pepuch 2013-03-15 09:44:46

+0

它與[鏈接]中提出的ImageMagick相似(http://stackoverflow.com/questions/2291358/how-我嘗試了使用ImageMagick在那篇文章中提出的方法,但是當它來到'ConvertCmd convert = new ConvertCmd();'時失敗了'' – jc88 2013-03-15 10:03:07

回答

13

已經通過一些研究和測試,發現了一種方法來轉換TIFF爲JPEG和抱歉等待很長時間只上傳了這個答案。

 SeekableStream s = new FileSeekableStream(inFile); 
     TIFFDecodeParam param = null; 
     ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param); 
     RenderedImage op = dec.decodeAsRenderedImage(0); 

     FileOutputStream fos = new FileOutputStream(otPath); 
     JPEGEncodeParam jpgparam = new JPEGEncodeParam(); 
     jpgparam.setQuality(67); 
     ImageEncoder en = ImageCodec.createImageEncoder("jpeg", fos, jpgparam); 
     en.encode(op); 
     fos.flush(); 
     fos.close(); 

p/s:otPath是指您希望存儲JPEG圖像的路徑。 例如: 「C:/image/abc.JPG」; INFILE是輸入文件,該文件是TIFF文件

至少這個方法是可行的我。如果還有其他更好的方法,請和我們一起分享。

感謝和問候,

+1

您可以從這裏獲取所需的jar:https://repository.jboss.org/nexus/content/repositories/thirdparty-releases/com/sun/media/jai-編解碼器/ 1.1.3/jai-codec-1.1.3.jar – 2014-09-10 09:46:38

+0

這對小圖像很好,就像我用5.7 KB的圖像試過的一樣,然後用80 KB的圖像嘗試並獲得java。 lang.IndexOutOfBoundsException。任何幫助? – 2017-05-17 16:38:19

+0

它的工作感謝... – ELITE 2017-07-04 11:49:38

0

首先來看看What is the best java image processing library/approach?。對於您的代碼,您可以使用

javax.imageio.ImageIO.write(im, type, represFile); 

像你可以在write an image to file example中看到的。

+0

我已經嘗試了** MKYong **的例子,但是當它來ImageIO.Read,它返回我空導致無法讀取TIF格式..如果我讀JPG和PNG那裏不會有問題..一切順利,但只是當試圖閱讀TIFF格式.. – jc88 2013-03-15 09:58:37

+0

請參閱http://stackoverflow.com/questions/2898311/reading-and-writing-out-tiff-image-in-java,它可能是有用的。 – user1929959 2013-03-15 10:02:04

+0

感謝您的建議,我未能添加JAI jar,雖然我已經包含在我的CLASSPATH中,但仍然無法導入它。可以向我提供有關如何包含JAI jar的更多信息?非常感謝您的幫助 – jc88 2013-03-15 10:06:15

1
  1. 添加依賴性

    <dependency> 
    <groupId>com.github.jai-imageio</groupId> 
    <artifactId>jai-imageio-core</artifactId> 
    <version>1.3.1</version> </dependency> 
    

https://mvnrepository.com/artifact/com.github.jai-imageio/jai-imageio-core

https://mvnrepository.com/artifact/com.github.jai-imageio/jai-imageio-core/1.3.1

  • 編碼

    final BufferedImage tif = ImageIO.read(new File("test.tif")); 
    ImageIO.write(tif, "png", new File("test.png")); 
    
  • +1

    多頁Tif文件呢?你可以使用這個庫與TIF有多個頁面?你能分享一些代碼嗎?謝謝。 – delkant 2016-12-05 11:55:12