基於 javax.imageio.ImageIO 實現圖像文件編碼輸出,支援:
ImageWriter 而定)。IIOWriteProgressListener)。Java SE 6 內建支援常見格式;若需擴展(如 TIFF),可安裝 JAI_ImageIO 等擴展庫。
/**
* 將 BufferedImage 編碼輸出為圖像文件
* @param file 目標文件,副檔名決定編碼格式
* @param image 待編碼圖像對象
* @param quality 壓縮質量百分比 (0-100)
* @param progressListener 進度監聽器,可為 null
* @return 是否成功
*/
public boolean writeImageFile(File file, BufferedImage image, int quality,
IIOWriteProgressListener progressListener) {
try {
String suffix = getFileSuffix(file);
if (suffix == null) return false;
Iterator<ImageWriter> it = ImageIO.getImageWritersBySuffix(suffix);
if (!it.hasNext()) return false;
FileImageOutputStream fos = new FileImageOutputStream(file);
ImageWriter writer = it.next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality / 100.0f);
writer.setOutput(fos);
if (progressListener != null) writer.addIIOWriteProgressListener(progressListener);
writer.write(null, new IIOImage(image, null, null), param);
writer.dispose();
fos.flush();
fos.close();
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
public String getFileSuffix(File file) {
return (file == null) ? null : getFileSuffix(file.getName());
}
public String getFileSuffix(String fileName) {
if (fileName == null) return null;
int i = fileName.lastIndexOf('.');
return (i > 0 && i < fileName.length() - 1) ? fileName.substring(i + 1) : "";
}
BufferedImage img = ImageIO.read(new File("input.png"));
File out = new File("output.jpg");
// 可選:實現進度監聽
IIOWriteProgressListener listener = new IIOWriteProgressListener() {
public void imageStarted(ImageWriter source, int imageIndex) { ... }
public void imageProgress(ImageWriter source, float percentageDone) {
System.out.printf("編碼進度: %.1f%%%n", percentageDone * 100);
}
public void imageComplete(ImageWriter source) { ... }
// ... 其他方法
};
writeImageFile(out, img, 85, listener); // 輸出質量 85% 的 JPG
ImageWriter 已註冊(ImageIO.getImageWritersBySuffix() 非空)。