在 Java 開發中,圖片處理是常見需求。無論是為了生成縮圖、添加版權水印,還是進行格式轉換與灰度處理,一個健壯的工具類都能大幅提升開發效率。本文將詳細解析一個功能全面的 ImageUtils 類,涵蓋圖片縮放、裁剪、類型轉換、灰度化、文字與圖片水印等核心功能,並提供完整的代碼實現與使用示例。
提供兩種縮放模式:
scale):根據指定倍數放大或縮小圖片。scale2):指定目標寬高,可選擇是否補白保持比例。// 示例:按比例縮小 2 倍
ImageUtils.scale("e:/abc.jpg", "e:/abc_scale.jpg", 2, true);
// 示例:縮放至 500x300,不足處補白
ImageUtils.scale2("e:/abc.jpg", "e:/abc_scale2.jpg", 500, 300, true);
支援三種裁剪方式:
cut):指定起始座標 (x,y) 及寬高。cut2):指定行數與列數,均分圖片。cut3):指定每塊切片的寬高,自動計算行列數。convert:實現 GIF、JPG、PNG、BMP 等格式互轉。gray:利用 ColorConvertOp 將彩色圖片轉為灰度圖。pressText, pressText2):支援自定義字體、顏色、大小、透明度與位置偏移。pressImage):將另一張圖片作為水印疊加,支援透明度控制與居中/偏移定位。// 文字水印示例
ImageUtils.pressText("版權所有", "src.jpg", "dest.jpg", "微軟雅黑", Font.BOLD, Color.RED, 30, 10, 10, 0.5f);
// 圖片水印示例
ImageUtils.pressImage("logo.png", "src.jpg", "dest.jpg", 0, 0, 0.3f);
scale2 方法中使用 AffineTransformOp 配合雙線性插值 (SCALE_SMOOTH),在縮放時能有效減少鋸齒與失真,並透過補白邏輯保持圖片原始比例不變形。
裁剪操作採用 CropImageFilter 結合 FilteredImageSource,直接從圖片數據源提取指定區域,避免了繪製中間圖帶來的性能開銷。
文字與圖片水印均通過 AlphaComposite.SRC_ATOP 規則混合,alpha 參數 (0.0~1.0) 精確控制水印透明度,實現從隱形到明顯的各種效果。
public class ImageUtils {
// 常見圖片格式常量
public static final String IMAGE_TYPE_JPG = "jpg";
public static final String IMAGE_TYPE_PNG = "png";
// ... 其他格式
// 1. 縮放方法
public final static void scale(String src, String dest, int scale, boolean flag) { ... }
public final static void scale2(String src, String dest, int w, int h, boolean padding) { ... }
// 2. 裁剪方法
public final static void cut(String src, String dest, int x, int y, int w, int h) { ... }
public final static void cut2(String src, String dir, int rows, int cols) { ... }
public final static void cut3(String src, String dir, int w, int h) { ... }
// 3. 轉換與灰度
public final static void convert(String src, String format, String dest) { ... }
public final static void gray(String src, String dest) { ... }
// 4. 水印方法
public final static void pressText(String text, String src, String dest, String font, int style, Color color, int size, int x, int y, float alpha) { ... }
public final static void pressText2(...) { ... }
public final static void pressImage(String markImg, String src, String dest, int x, int y, float alpha) { ... }
// 輔助:計算字符串視覺長度 (中文算 2)
public final static int getLength(String text) { ... }
}
IOException 並打印堆疊跡,生產環境建議拋出自定義異常或記錄日誌。Graphics / Graphics2D 使用後需調用 dispose();RandomAccessFile 等流需在 finally 塊中關閉。cut2, cut3) 可引入多線程加速。ImageUtils 封裝了 Java AWT/ImageIO 的底層操作,提供了開箱即用的圖片處理能力。無論是簡單的縮圖生成,還是複雜的水印佈局,均可通過調用靜態方法輕鬆實現。開發者可根據項目需求,進一步擴展如旋轉、鏡像、濾鏡等高級功能,構建專屬的圖片處理服務層。