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

Java 圖片處理工具類:縮放、裁剪、水印與格式轉換完整指南

     編輯:Java 相關知識

前言

在 Java 開發中,圖片處理是常見需求。無論是為了生成縮圖、添加版權水印,還是進行格式轉換與灰度處理,一個健壯的工具類都能大幅提升開發效率。本文將詳細解析一個功能全面的 ImageUtils 類,涵蓋圖片縮放、裁剪、類型轉換、灰度化、文字與圖片水印等核心功能,並提供完整的代碼實現與使用示例。

核心功能模組

1. 圖片縮放

提供兩種縮放模式:

  • 按比例縮放 (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);

2. 圖片裁剪

支援三種裁剪方式:

  • 座標裁剪 (cut):指定起始座標 (x,y) 及寬高。
  • 網格裁剪 (cut2):指定行數與列數,均分圖片。
  • 固定尺寸裁剪 (cut3):指定每塊切片的寬高,自動計算行列數。

3. 格式轉換與灰度化

  • convert:實現 GIF、JPG、PNG、BMP 等格式互轉。
  • gray:利用 ColorConvertOp 將彩色圖片轉為灰度圖。

4. 水印處理

  • 文字水印 (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);

關鍵技術點解析

AffineTransformOp 實現高質量縮放

scale2 方法中使用 AffineTransformOp 配合雙線性插值 (SCALE_SMOOTH),在縮放時能有效減少鋸齒與失真,並透過補白邏輯保持圖片原始比例不變形。

CropImageFilter 實現無損裁剪

裁剪操作採用 CropImageFilter 結合 FilteredImageSource,直接從圖片數據源提取指定區域,避免了繪製中間圖帶來的性能開銷。

AlphaComposite 控制水印透明度

文字與圖片水印均通過 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) { ... }
}

使用建議與注意事項

  1. 異常處理:所有方法均捕獲 IOException 並打印堆疊跡,生產環境建議拋出自定義異常或記錄日誌。
  2. 資源釋放:Graphics / Graphics2D 使用後需調用 dispose();RandomAccessFile 等流需在 finally 塊中關閉。
  3. 線程安全:工具類為無狀態靜態方法,天然線程安全,可直接在多線程環境下調用。
  4. 性能優化:大批量處理時,建議使用線程池並行執行;裁剪網格圖 (cut2, cut3) 可引入多線程加速。
  5. 總結

    ImageUtils 封裝了 Java AWT/ImageIO 的底層操作,提供了開箱即用的圖片處理能力。無論是簡單的縮圖生成,還是複雜的水印佈局,均可通過調用靜態方法輕鬆實現。開發者可根據項目需求,進一步擴展如旋轉、鏡像、濾鏡等高級功能,構建專屬的圖片處理服務層。

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