首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 圖片縮放高保真:getScaledInstance 慢且模糊,改用 Graphics2D 雙線性/雙三次插值 + RenderingHints

     編輯:程式設計綜合問答

`Image.getScaledInstance()` 預設最近鄰插值,質量差且同步阻塞。高保真方案:

Graphics2D 高質量縮放

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;
}

多級縮放(縮小超過 2 倍時)

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 blob = rs.getBlob("img_col");
try (InputStream is = blob.getBinaryStream()) {
    BufferedImage src = ImageIO.read(is);
    BufferedImage thumb = scaleHighQuality(src, 200, 200);
    // 輸出/存儲 thumb
}

**注意**:縮放本質是信息丟失,無法「無損放大」。原圖分辨率決定上限。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved