Java實現圖片水印文字鋪完效果
阿新 • • 發佈:2020-11-02
package com.lqm.draw;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
/**
* @ProjectName: algorithm
* @Package: com.lqm.draw
* @ClassName: AddWatermarkUtil
* @Author: luqiming
* @Description:
* @Date: 2020/11/2 11:24
* @Version: 1.0
*/
public class AddWatermarkUtil {
/**
* 水印之間的橫向間隔
*/
private static final int XMOVE = 80;
/**
* 水印之間的縱向間隔
*/
private static final int YMOVE = 80;
/**
* 圖片新增水印
*
* @param outImgPath 新增水印後圖片輸出路徑
* @param markContentColor 水印文字的顏色
* @param fontSize 文字大小
* @param waterMarkContent 水印的文字,多排水印請使用"||"分割
* @param srcImgPath 需要新增水印的圖片的路徑
*/
public static void waterPress(String srcImgPath, String outImgPath, Color markContentColor, int fontSize, String waterMarkContent) {
try {
String[] waterMarkContents = waterMarkContent.split("\\|\\|");
// 讀取原圖片資訊
File srcImgFile = new File(srcImgPath);
Image srcImg = ImageIO.read(srcImgFile);
// 原圖寬度
int srcImgWidth = srcImg.getWidth(null);
// 原圖高度
int srcImgHeight = srcImg.getHeight(null);
// 加水印
BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
// 得到畫筆物件
Graphics2D g = bufImg.createGraphics();
g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
// Font font = new Font("Courier New", Font.PLAIN, 12);
// 字型
Font font = new Font("宋體", Font.PLAIN, fontSize);
// 根據圖片的背景設定水印顏色
g.setColor(markContentColor);
// 設定水印文字字型
g.setFont(font);
// 設定水印旋轉
g.rotate(Math.toRadians(-45), (double) bufImg.getWidth() / 2, (double) bufImg.getHeight() / 2);
// 獲取其中最長的文字水印的大小
int maxLen = 0;
int maxHigh = 0;
for (int i = 0; i < waterMarkContents.length; i++) {
waterMarkContent = waterMarkContents[i];
int fontlen = getWatermarkLength(waterMarkContent, g);
if (fontlen >= maxLen) {
maxLen = fontlen;
}
maxHigh = maxHigh + (i + 1) * fontSize + 10;
}
// 文字長度相對於圖片寬度應該有多少行
int line = srcImgWidth * 2 / maxLen;
int co = srcImgHeight * 2 / maxHigh;
int yz = 0;
// 填充Y軸方向
for (int a = 0; a < co; a++) {
int t = 0;
for (int j = 0; j < waterMarkContents.length; j++) {
waterMarkContent = waterMarkContents[j];
int y = (j + 1) * fontSize + 10 + t;
// 文字疊加,自動換行疊加,注意符號
int tempX = -srcImgWidth / 2;
int tempY = -srcImgHeight / 2 + y + yz;
// 單字元長度
int tempCharLen = 0;
// 單行字元總長度臨時計算
int tempLineLen = 0;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < waterMarkContent.length(); i++) {
char tempChar = waterMarkContent.charAt(i);
tempCharLen = getCharLen(tempChar, g);
tempLineLen += tempCharLen;
// 和圖片的長度進行對應的比較操作
if (tempLineLen >= srcImgWidth) {
// 長度已經滿一行,進行文字疊加
g.drawString(sb.toString(), tempX, tempY);
t = t + fontSize;
// 清空內容,重新追加
sb.delete(0, sb.length());
tempY += fontSize;
tempLineLen = 0;
}
// 追加字元
sb.append(tempChar);
}
// 填充X軸
for (int z = 0; z < line; z++) {
// 最後疊加餘下的文字
g.drawString(sb.toString(), tempX, tempY);
tempX = tempX + maxLen + XMOVE;
}
}
yz = yz + maxHigh + YMOVE;
}
g.dispose();
// 輸出圖片
FileOutputStream outImgStream = new FileOutputStream(outImgPath);
ImageIO.write(bufImg, "jpg", outImgStream);
outImgStream.flush();
outImgStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static int getCharLen(char c, Graphics2D g) {
return g.getFontMetrics(g.getFont()).charWidth(c);
}
/**
* 獲取水印文字總長度
*
* @paramwaterMarkContent水印的文字
* @paramg
* @return水印文字總長度
*/
public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
}
public static void main(String[] args) {
// 原圖位置, 輸出圖片位置, 水印文字顏色,水印文字大小 水印文字
String font = "張天愛||就很完美||2020-11-2 12:00:00";
String inputAddress ="F:\\UpupooWallpaper\\zta.jpg";
String outputAddress="F:\\UpupooWallpaper\\ztass.jpg";
Color color =Color.red;
waterPress(inputAddress, outputAddress, color,30, font);
}
}
水印前效果:
水印後效果: