从网上找到了前辈们写的代码,然后优化整理下,实现了图片叠加水印,也就是文字叠加,然后再实现根据总文字的长度进行自动换行叠加文字
importjavax.imageio.ImageIO;
importjava.awt.*;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.FileOutputStream;
/**
* Created by uchoice on 2016/11/25.
*/
public classMyTest {
/**
* 图片添加水印
*@paramsrcImgPath需要添加水印的图片的路径
*@paramoutImgPath添加水印后图片输出路径
*@parammarkContentColor水印文字的颜色
*@paramfontSize文字大小
*@paramwaterMarkContent水印的文字
*/
public voidwaterPress(String
srcImgPath, String outImgPath, Color markContentColor,int
fontSize, String waterMarkContent) {
try{
// 读取原图片信息
File srcImgFile =new
File(srcImgPath);
Image srcImg = ImageIO.read(srcImgFile);
intsrcImgWidth = srcImg.getWidth(null);
intsrcImgHeight = 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);
intfontlen = getWatermarkLength(waterMarkContent, g);
intline = fontlen/srcImgWidth;//文字长度相对于图片宽度应该有多少行
inty = srcImgHeight
- (line + 1)*fontSize;
System.out.println("水印文字总长度:"+
fontlen + ",图片宽度:"+ srcImgWidth +
",字符个数:"+ waterMarkContent.length());
//文字叠加,自动换行叠加
inttempX =
0;
inttempY = y;
inttempCharLen =
0;//单字符长度
inttempLineLen =
0;//单行字符总长度临时计算
StringBuffer sb =new
StringBuffer();
for(inti=0;
i<waterMarkContent.length(); i++) {
chartempChar = 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 intgetCharLen(charc,
Graphics2D g) {
returng.getFontMetrics(g.getFont()).charWidth(c);
}
/**
* 获取水印文字总长度
*@paramwaterMarkContent水印的文字
*@paramg
*@return水印文字总长度
*/
public intgetWatermarkLength(String
waterMarkContent, Graphics2D g) {
returng.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(),0,
waterMarkContent.length());
}
public static voidmain(String[] args) {
// 原图位置, 输出图片位置, 水印文字颜色, 水印文字
String font ="qqqqqqssss2222.....
ooooddd水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整";
newMyTest().waterPress("/Users/slink/3f608a0601_0.jpg","/Users/slink/afterWatermark.jpg",
Color.red,40, font);
}
}