从网上找到了前辈们写的代码,然后优化整理下,实现了图片叠加水印,也就是文字叠加,然后再实现根据总文字的长度进行自动换行叠加文字
import
javax.imageio.ImageIO;
import
java.awt.*;
import
java.awt.image.BufferedImage;
import
java.io.File;
import
java.io.FileOutputStream;
/**
* Created by uchoice on 2016/11/25.
*/
public class
MyTest {
/**
* 图片添加水印
*
@param
srcImgPath
需要添加水印的图片的路径
*
@param
outImgPath
添加水印后图片输出路径
*
@param
markContentColor
水印文字的颜色
*
@param
fontSize
文字大小
*
@param
waterMarkContent
水印的文字
*/
public void
waterPress(String srcImgPath, String outImgPath, Color markContentColor,
int
fontSize, String waterMarkContent) {
try
{
// 读取原图片信息
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);
int
fontlen = getWatermarkLength(waterMarkContent, g);
int
line = fontlen/srcImgWidth;
//文字长度相对于图片宽度应该有多少行
int
y = srcImgHeight - (line +
1
)*fontSize;
System.
out
.println(
"水印文字总长度:"
+ fontlen +
",图片宽度:"
+ srcImgWidth +
",字符个数:"
+ waterMarkContent.length());
//文字叠加,自动换行叠加
int
tempX =
0
;
int
tempY = y;
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);
sb.delete(
0
, sb.length());
//清空内容,重新追加
tempY += fontSize;
tempLineLen =
0
;
}
sb.append(tempChar);
//追加字符
}
g.drawString(sb.toString(), tempX, tempY);
//最后叠加余下的文字
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);
}
/**
* 获取水印文字总长度
*
@param
waterMarkContent
水印的文字
*
@param
g
*
@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 =
"qqqqqqssss2222..... ooooddd水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整"
;
new
MyTest().waterPress(
"/Users/slink/3f608a0601_0.jpg"
,
"/Users/slink/afterWatermark.jpg"
, Color.
red
,
40
, font);
}
}