java文字水印换行_Java实现图片水印文字换行、平铺、旋转效果-Go语言中文社区...

这段代码演示了如何使用Java在图片上添加文字水印,并实现文字换行、平铺及旋转效果。通过Graphics2D进行图形绘制,调整水印颜色、字体大小和旋转角度,实现多行文字水印的动态布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

import javax.imageio.ImageIO;

public class MyTest {

/**

* 水印之间的横向间隔

*/

private static final int XMOVE = 80;

/**

* 水印之间的纵向间隔

*/

private static final int YMOVE = 80;

/**

* 图片添加水印

*

* @param outImgPath 添加水印后图片输出路径

* @param markContentColor 水印文字的颜色

* @param fontSize 文字大小

* @param waterMarkContent 水印的文字,多排水印请使用"||"分割

* @param srcImgPath 需要添加水印的图片的路径

*/

public 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 int getCharLen(char c, Graphics2D g) {

return g.getFontMetrics(g.getFont()).charWidth(c);

}

/**

* 获取水印文字总长度

*

* @paramwaterMarkContent水印的文字

* @paramg

* @return水印文字总长度

*/

public 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 = "优快云||stepmore||2020-05-27 17:00:00";

new MyTest().waterPress("/Users/yangyun/Documents/personal_doc/pic/test1.png",

"/Users/yangyun/Documents/personal_doc/pic/yy.png", Color.red, 30, font);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值