用Java输出分辨率300dpi以上的TIFF图像
国外期刊发表文章需要提供分辨率在300~600dpi的图像,而使用javax.imageio.ImageIO只能够输出72dpi的JPG、PNG或GIF图像,无法满足要求。
Java Advanced Imaging(JAI)的jai-imageio工具提供了输出高分辨率TIFF图像解决方法。网上有一篇相关的文章《使用 Java 进行图像处理 - 编码输出高分辨率图像》 ,但是笔者使用其中代码生成的图像在Windows下右键查看属性确实显示为300dpi,但是使用Photoshop或者Fireworks等图像处理工具时却仍然显示为72dpi。本人经过一番摸索,终于解决了这个问题,现总结余下:
先从https://jai-imageio.dev.java.net/binary-builds.html 下载jai-imageio.jar,另外编译还需要JAIl的jai_codec.jar和jai_core.jar
import com.sun.media.imageio.plugins.tiff.TIFFTag; import com.sun.media.jai.codec.TIFFEncodeParam; import com.sun.media.jai.codec.TIFFField; import com.sun.media.jai.codecimpl.TIFFImageEncoder; import java.awt.image.RenderedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /** * <p>TIFFOutput.java</p> * <p>Created on Apr 6, 2009, 10:46:41 PM</p> * <p>Copyright (c) 2007-2009. CUCKOO Workgroup, USTC, P.R.China</p> * @author Ren Jian */ public class TiffOutput { public TiffOutput(RenderedImage image, String outputFilePath, int dpi) { try { if (image != null) { 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) dpi, 1}, {0, 0}}); extras[1] = new TIFFField(283, TIFFTag.TIFF_RATIONAL, 1, (Object) new long[][]{{(long) dpi, 1}, {0, 0}}); param.setExtraFields(extras); File outputFile = new File(outputFilePath); outputFile.createNewFile(); FileOutputStream outputStream = new FileOutputStream(outputFile); TIFFImageEncoder encoder = new TIFFImageEncoder(outputStream, param); encoder.encode(image); outputStream.close(); } } catch (IOException ex) { ex.printStackTrace(); } } }