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 更標準。
ImageReader.setInput(stream, true) 開啟僅讀模式,避免全量載入堆內存。BufferedImage 緩衝區,減少 GC 壓力。