`Image.getScaledInstance()` 預設最近鄰插值,質量差且同步阻塞。高保真方案:
public static BufferedImage scaleHighQuality(BufferedImage src, int w, int h) {
BufferedImage dst = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = dst.createGraphics();
// 關鍵渲染提示
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); // 雙三次
g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.drawImage(src, 0, 0, w, h, null);
g2.dispose();
return dst;
}
while (src.getWidth() > w * 2 || src.getHeight() > h * 2) {
src = scaleHighQuality(src, src.getWidth()/2, src.getHeight()/2);
}
return scaleHighQuality(src, w, h);
Blob blob = rs.getBlob("img_col");
try (InputStream is = blob.getBinaryStream()) {
BufferedImage src = ImageIO.read(is);
BufferedImage thumb = scaleHighQuality(src, 200, 200);
// 輸出/存儲 thumb
}
**注意**:縮放本質是信息丟失,無法「無損放大」。原圖分辨率決定上限。