首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 圖片縮放工具類:BufferedImage 雙線性插值、等比縮放與品質控制

     編輯:Java 程式設計入門

核心縮放邏輯

public class ImageResizeUtil {
    /** 
     * @param srcPath  源圖路徑
     * @param destPath 目標路徑
     * @param scale    縮放倍數(>1 放大,<1 縮小)
     * @param quality  JPEG 品質 0.0f~1.0f
     */
    public static void resize(String srcPath, String destPath, double scale, float quality) throws IOException {
        BufferedImage src = ImageIO.read(new File(srcPath));
        int w = (int) (src.getWidth() * scale);
        int h = (int) (src.getHeight() * scale);

        BufferedImage dest = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = dest.createGraphics();
        // 高品質渲染提示
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        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();

        // JPEG 輸出品質控制
        try (FileOutputStream fos = new FileOutputStream(destPath)) {
            ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
            ImageWriteParam param = writer.getDefaultWriteParam();
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            param.setCompressionQuality(quality);
            writer.setOutput(ImageIO.createImageOutputStream(fos));
            writer.write(null, new IIOImage(dest, null, null), param);
            writer.dispose();
        }
    }
}

等比縮放(指定目標寬/高)

public static void resizeKeepRatio(String src, String dest, int maxW, int maxH, float quality) throws IOException {
    BufferedImage img = ImageIO.read(new File(src));
    double ratio = Math.min((double) maxW / img.getWidth(), (double) maxH / img.getHeight());
    int w = (int) (img.getWidth() * ratio);
    int h = (int) (img.getHeight() * ratio);
    // 後續同 resize()...
}

關鍵渲染提示說明

Hint Key推薦 Value作用
KEY_INTERPOLATIONVALUE_INTERPOLATION_BILINEAR / BICUBIC雙線性/雙三次插值,縮放平滑度
KEY_RENDERINGVALUE_RENDER_QUALITY優先品質而非速度
KEY_ANTIALIASINGVALUE_ANTIALIAS_ON抗鋸齒
KEY_ALPHA_INTERPOLATIONVALUE_ALPHA_INTERPOLATION_QUALITY透明度插值品質

格式支援與透明度處理

  • PNG 透明背景:用 BufferedImage.TYPE_INT_ARGB,輸出 ImageIO.write(dest, "png", ...)
  • JPEG 無透明:TYPE_INT_RGB,白色填充透明區
  • WebP:需引入 webp-imageio 插件

效能建議

  • 大批量處理:線程池 + BufferedImage 複用(同尺寸)
  • 超大圖(>50MP):分塊處理或使用 ImageReader.read(param) 區域解碼
  • 服務端無頭模式:啟動參數 -Djava.awt.headless=true

現代替代:Thumbnailator(一行代碼)

<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.18</version>
</dependency>

// 等比縮放到 200x200 內,輸出品質 0.8
Thumbnails.of("src.jpg").size(200, 200).outputQuality(0.8).toFile("dest.jpg");
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved