首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 圖像編碼輸出實戰:支援進度監聽與質量控制

     編輯:Java 相關知識

核心功能

基於 javax.imageio.ImageIO 實現圖像文件編碼輸出,支援:

  • 多格式輸出(JPG、BMP、PNG、GIF 等,視運行環境註冊的 ImageWriter 而定)。
  • 編碼進度監聽(IIOWriteProgressListener)。
  • 壓縮質量控制(針對 JPG 等有損格式,0-100 百分比)。

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() 非空)。
  • 質量參數僅對支援壓縮質量控制的格式(如 JPEG)生效,無損格式會忽略。
  • 大文件編碼建議在後台線程執行,避免阻塞 UI 線程。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved