1. 程式人生 > >用Java輸出解析度300dpi以上的TIFF影象

用Java輸出解析度300dpi以上的TIFF影象

http://blog.csdn.net/casularm/article/details/4054484

國外期刊發表文章需要提供解析度在300~600dpi的影象,而使用javax.imageio.ImageIO只能夠輸出72dpi的JPG、PNG或GIF影象,無法滿足要求。

Java Advanced Imaging(JAI)的jai-imageio工具提供了輸出高解析度TIFF影象解決方法。網上有一篇相關的文章《使用 Java 進行影象處理 - 編碼輸出高解析度影象》 ,但是筆者使用其中程式碼生成的影象在Windows下右鍵檢視屬性確實顯示為300dpi,但是使用Photoshop或者Fireworks等影象處理工具時卻仍然顯示為72dpi。本人經過一番摸索,終於解決了這個問題,現總結餘下:

下載jai-imageio.jar,另外編譯還需要JAIl的jai_codec.jar和jai_core.jar

  1. import com.sun.media.imageio.plugins.tiff.TIFFTag;  
  2. import com.sun.media.jai.codec.TIFFEncodeParam;  
  3. import com.sun.media.jai.codec.TIFFField;  
  4. import com.sun.media.jai.codecimpl.TIFFImageEncoder;  
  5. import java.awt.image.RenderedImage;  
  6. import java.io.File;  
  7. import java.io.FileOutputStream;  
  8. import java.io.IOException;  
  9. /** 
  10.  * <p>TIFFOutput.java</p> 
  11.  * <p>Created on Apr 6, 2009, 10:46:41 PM</p> 
  12.  * <p>Copyright (c) 2007-2009. CUCKOO Workgroup, USTC, P.R.China</p> 
  13.  * @author Ren Jian 
  14.  */
  15. publicclass TiffOutput {  
  16.     public TiffOutput(RenderedImage image, String outputFilePath, int dpi) {  
  17.         try {  
  18.             if (image != null) {  
  19.                 TIFFEncodeParam param = new TIFFEncodeParam();  
  20.                 param.setCompression(TIFFEncodeParam.COMPRESSION_NONE);  
  21.                 TIFFField[] extras = new TIFFField[2];  
  22.                 extras[0] = new TIFFField(282, TIFFTag.TIFF_RATIONAL, 1, (Object) newlong[][]{{(long) dpi, 1}, {00}});  
  23.                 extras[1] = new TIFFField(283, TIFFTag.TIFF_RATIONAL, 1, (Object) newlong[][]{{(long) dpi, 1}, {00}});  
  24.                 param.setExtraFields(extras);  
  25.                 File outputFile = new File(outputFilePath);  
  26.                 outputFile.createNewFile();  
  27.                 FileOutputStream outputStream = new FileOutputStream(outputFile);  
  28.                 TIFFImageEncoder encoder = new TIFFImageEncoder(outputStream, param);  
  29.                 encoder.encode(image);  
  30.                 outputStream.close();  
  31.             }  
  32.         } catch (IOException ex) {  
  33.             ex.printStackTrace();  
  34.         }  
  35.     }  
  36. }