用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;
/**
*
TIFFOutput.java
*
Created on Apr 6, 2009, 10:46:41 PM
*
Copyright (c) 2007-2009. CUCKOO Workgroup, USTC, P.R.China
* @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();
}
}
}