圖庫項目中,圖片尺寸標準化是首要難題。本文基於 java.awt.image.BufferedImage 與 ImageIO,實現高質量的單圖等比縮放、固定尺寸縮放,並擴展為批量處理工具類,解決「海量原圖 → 統一縮略圖」的工程化需求。
public class ImageResizer {
/** 等比縮小:resizeTimes > 1 表示縮小倍數(如 2 = 1/2) */
public BufferedImage resizeImage(BufferedImage src, float resizeTimes) { ... }
/** 等比縮放:resizeTimes 為縮放比例(0.5 = 縮小一半,2 = 放大兩倍) */
public BufferedImage zoomImage(BufferedImage src, float resizeTimes) { ... }
/** 高質量 JPEG 輸出(質量 1.0) */
public boolean writeHighQuality(BufferedImage img, String fullPath) { ... }
/** 通用格式寫入磁盤(保持原格式) */
public boolean writeToDisk(BufferedImage img, String dir, String fileName) { ... }
/** 批量讀取指定後綴圖片 */
public List<BufferedImage> getImageList(String dir, String[] extensions) { ... }
/** 解析文件擴展名 */
private String getExtension(String fileName) { ... }
}
BufferedImage result = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB);
result.getGraphics().drawImage(
src.getScaledInstance(toWidth, toHeight, Image.SCALE_SMOOTH),
0, 0, null
);
TYPE_INT_RGB:無透明通道,體積較小;需透明請用 TYPE_INT_ARGB。SCALE_SMOOTH:雙三次插值,質量優於 SCALE_FAST、SCALE_AREA_AVERAGING。FileOutputStream fos = new FileOutputStream(fullPath);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
JPEGEncodeParam param = JPEGCodec.getDefaultJPEGEncodeParam(img);
param.setQuality(1f, true); // 最高質量
encoder.encode(img, param);
fos.close();
編譯報錯 com.sun.image.codec.* 為受限 API → IDE 設置:Preferences → Java → Compiler → Errors/Warnings → Deprecated and restricted API → Forbidden references → Warning。
public static void main(String[] args) throws Exception {
String inputDir = "F:/pic";
String outputDir = "F:/picNew";
float scale = 0.25f; // 縮小至 1/4
ImageResizer resizer = new ImageResizer();
List<BufferedImage> list = resizer.getImageList(inputDir, new String[]{"jpg", "png"});
for (BufferedImage img : list) {
resizer.writeHighQuality(resizer.zoomImage(img, scale), outputDir);
}
}
ExecutorService + CompletableFuture 並發處理,CPU 密集型任務設置核心數 = CPU 核心數。ImageInputStream 流式讀取 + 分塊處理,或限制最大像素(如 4000×4000)。ImageIO.write(img, "png", ...) 或 JPEG,避免 PNG 轉 JPEG 損失透明度。TwelveMonkeys ImageIO 或 metadata-extractor 保留 EXIF 方向、色彩配置文件。Consumer<Progress> 回調,便於 GUI/Web 顯示進度條。Thumbnails.of(file).scale(0.25).toFile(out) 一行搞定,內部處理了所有邊界情況。ImageIO 增強:原生支持更多格式、更好記憶體管理。從手寫 BufferedImage 到引入成熟庫,核心邏輯不變:**讀 → 解碼 → 縮放插值 → 編碼 → 寫**。理解底層原理,才能在選型與調優時游刃有餘。