ImageUtils 提供靜態方法實現:
核心採用 BufferedImage.getScaledInstance() 重繪,輸出 TYPE_INT_RGB 格式。
private static BufferedImage convert(int width, int height, BufferedImage input) {
BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Image scaled = input.getScaledInstance(output.getWidth(), output.getHeight(), output.getType());
output.createGraphics().drawImage(scaled, null, null);
return output;
}
建立目標畫布,將原圖縮放繪製上去,返回新 BufferedImage。
| 方法簽名 | 用途 |
|---|---|
convert(w, h, InputStream, OutputStream, format) | 流式處理,指定輸出格式 |
convert(File, File) | 檔案間轉換,自動從副檔名推斷格式 |
convert(w, h, File, File) | 指定尺寸的檔案轉換 |
convert(w, h, String, String) | 路徑字串版本 |
equimultipleConvert(...) | 等比縮放,自動計算適配尺寸 |
if (srcW / srcH >= targetW / targetH) {
// 以寬度為基準
if (srcW > targetW) {
targetH = srcH * targetW / srcW;
} else { targetW = srcW; targetH = srcH; }
} else {
// 以高度為基準
if (srcH > targetH) {
targetW = srcW * targetH / srcH;
} else { targetW = srcW; targetH = srcH; }
}
確保縮放後不超出目標矩形,且保持原始比例。
@Test
public void test() throws Exception {
System.out.println(ImageUtils.convert(1650, 1024, "c:\\1.png", "c:\\1.png.jpg"));
System.out.println(ImageUtils.convert(400, 300, "c:\\1.jpg", "c:\\1.jpg.png"));
System.out.println(ImageUtils.equimultipleConvert(1600, 1400, new File("c:\\1.bmp"), new File("c:\\1Equimultiple.jpeg")));
}
測試涵蓋 PNG→JPG、JPG→PNG、BMP→GIF 等格式互轉,及等比縮放驗證。
getScaledInstance() 預設使用平滑縮放,品質較好但速度一般;大批量處理可考慮 Graphics2D 配合 RenderingHints。TYPE_INT_RGB,不保留 Alpha 通道;若需透明背景請改用 TYPE_INT_ARGB。