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

Java 圖片處理實戰:基於 JIMI 實現多格式轉換、質量壓縮與縮放全攻略

     編輯:Java 程式設計入門

技術選型:為什麼選 JIMI?

  • 支持幾乎所有格式**解碼** (讀取):BMP、GIF、JPEG、PNG、TIFF、TGA、PCX 等。
  • 提供主流格式**編碼** (寫入) API:JPEG、PNG、BMP 等。
  • 缺口:原生不支持 GIF/TIFF 編碼,需集成第三方編碼器或降級為 JPEG。
  • 下載:官方站點 (含源碼、Demo、文檔)。

核心 API 架構 (com.sun.jimi.core)

  • Jimi.getImageProducer(source):統一解碼入口,自動識別格式,返回 ImageProducer。
  • Jimi.createJimiWriter(dest):根據目標文件擴展名自動選擇編碼器,返回 JimiWriter。
  • JimiWriter.setSource(producer):連接解碼器與編碼器管道。
  • JimiWriter.putImage(dest):執行轉換並寫入文件。
  • Options 系列類 (JPGOptions、PNGOptions...):設置輸出屬性 (質量、壓縮級別、透明色等)。

通用格式轉換工具類

public class ImageConverter {
    public static void convert(String srcPath, String destPath, float quality) {
        try {
            // 1. 解碼 (格式透明)
            ImageProducer producer = Jimi.getImageProducer(srcPath);
            
            // 2. 編碼器
            JimiWriter writer = Jimi.createJimiWriter(destPath);
            writer.setSource(producer);
            
            // 3. 格式專屬參數 (以 JPEG 為例)
            if (destPath.toLowerCase().endsWith(".jpg") || destPath.toLowerCase().endsWith(".jpeg")) {
                JPGOptions opts = new JPGOptions();
                opts.setQuality(Math.round(quality * 100)); // 0-100
                writer.setOptions(opts);
            }
            // PNG 可設置 compressionLevel 等
            
            // 4. 執行輸出
            writer.putImage(destPath);
        } catch (JimiException e) {
            throw new RuntimeException("圖片轉換失敗: " + srcPath, e);
        }
    }
}

圖片線性縮放實現

JIMI 本身不直接提供縮放 API,需結合 java.awt.Image 與 Graphics2D 實現:

public static void scaleAndSave(String src, String dest, int targetW, int targetH, float quality) {
    ImageProducer producer = Jimi.getImageProducer(src);
    // 獲取原始圖片寬高 (需渲染一次)
    Image img = Toolkit.getDefaultToolkit().createImage(producer);
    // 等待加載完成...
    
    BufferedImage scaled = new BufferedImage(targetW, targetH, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = scaled.createGraphics();
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2d.drawImage(img, 0, 0, targetW, targetH, null);
    g2d.dispose();
    
    // 將 BufferedImage 轉為 ImageProducer 再交給 JIMI 編碼
    // 或直接使用 ImageIO (JDK 1.4+) 輸出,更簡潔
    ImageIO.write(scaled, "jpg", new File(dest)); // 需註冊 JPEG 插件
}

建議:現代項目優先使用 javax.imageio.ImageIO (JDK 內置) + TwelveMonkeys ImageIO 插件庫,支持更多格式、無需外部 JIMI 依賴、API 更標準。

GIF/TIFF 編碼缺口解決方案

  1. GIF 編碼:使用 JGIF 或 Animated GIF Library。
  2. TIFF 編碼:集成 JAI Image I/O (官方擴展) 或 TwelveMonkeys ImageIO (推薦,單 JAR 支持 20+ 格式)。
  3. 降級策略:業務允許時統一轉為 PNG (無損) 或 JPEG (有損),簡化技術棧。

性能與內存優化提示

  • 大圖處理使用 ImageReader.setInput(stream, true) 開啟僅讀模式,避免全量載入堆內存。
  • 批量轉換復用 BufferedImage 緩衝區,減少 GC 壓力。
  • 並發處理時限制線程數 (CPU 核心數 * 2),防止 OOM。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved