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

Java 實現圖片文字水印:完整範例與原始碼解析

     編輯:程式設計綜合問答

需求背景

開發中常需為圖片添加文字水印(如版權聲明、用戶標識),且要求輸入輸出均為 byte[] 以利於網路傳輸或資料庫存儲。

核心實現步驟

  1. Byte 數組轉 BufferedImage:使用 ImageIO.read(new ByteArrayInputStream(srcByteImg))。
  2. 獲取 Graphics2D 畫筆:呼叫 buffImg.createGraphics(),設定抗鋸齒、字體、顏色、透明度。
  3. 計算水印位置:利用 FontMetrics 取得文字寬高,置中繪製:
    g.drawString(logoText, (width - logoWidth)/2, height/2 + ascent/2 - descent/2);
  4. 合成輸出:將繪製後的 BufferedImage 寫入 ByteArrayOutputStream,再 toByteArray() 返回。

完整代碼範例

public static byte[] markByText(String logoText, byte[] srcByteImg) {
    try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
        BufferedImage buffImg = ImageIO.read(new ByteArrayInputStream(srcByteImg));
        Graphics2D g = buffImg.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        int width = buffImg.getWidth(), height = buffImg.getHeight();
        g.drawImage(buffImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
        g.setColor(Color.RED);
        g.setFont(new Font("微軟正黑體", Font.BOLD, 30));
        FontMetrics fm = g.getFontMetrics();
        int textWidth = fm.stringWidth(logoText);
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
        g.drawString(logoText, (width - textWidth)/2, height/2 + fm.getAscent()/2 - fm.getDescent()/2);
        g.dispose();
        ImageIO.write(buffImg, "JPG", os);
        return os.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

常見錯誤與解決

若遇到 ServiceConfigurationError: javax.imageio.spi.ImageReaderSpi,通常是類路徑衝突(如多版本 imageio 庫),請清理依賴或指定 JDK 內建實作。

效果展示

原始圖片 加浮水印後

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