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

Java 圖片上傳縮圖自動生成:ImageIO 讀寫與 AffineTransform 等比例縮放實作

     編輯:Java 相關知識

使用 ImageIO 讀取上傳圖片,計算縮放比例配合 AffineTransformOp 生成高品質縮圖,支援 JPG/PNG/GIF 格式轉換,並提供 Linux 無圖形介面環境的 headless 參數設定。

核心邏輯

public boolean createThumbnail(String fromDir, String toDir,
                               String imgFile, String sysImgPrefix) throws Exception {
  File src = new File(fromDir, imgFile);
  BufferedImage bi = ImageIO.read(src);
  
  // 目標最大寬高 120px,等比縮放
  double ratio = 1.0;
  if (bi.getHeight() > 120 || bi.getWidth() > 120) {
    ratio = bi.getHeight() > bi.getWidth() ? 
            120.0 / bi.getHeight() : 120.0 / bi.getWidth();
  }
  
  AffineTransformOp op = new AffineTransformOp(
      AffineTransform.getScaleInstance(ratio, ratio), null);
  BufferedImage thumb = op.filter(bi, null);
  
  // 格式判斷:JPG 維持,GIF 轉 PNG (ImageIO 限制)
  String ext = isJpg(imgFile) ? "jpg" : "png";
  File dest = new File(toDir, sysImgPrefix + "." + ext);
  ImageIO.write(thumb, ext, dest);
  return true;
}

Linux 無頭模式設定

  • JDK 1.4 前:需安裝 XFree86 + Xvfb,設定 export DISPLAY=host:0.0。
  • JDK 1.4+:啟動參數加入 -Djava.awt.headless=true 即可。

關鍵 API

  • ImageIO.read/write:統一圖片 I/O,支援插件擴充格式。
  • BufferedImage.getScaledInstance:簡易縮放 (品質較低)。
  • AffineTransformOp + AffineTransform.getScaleInstance:高品質雙三次/雙線性插值縮放。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved