从网上找到了前辈们写的代码,然后优化整理下,实现了图片叠加水印,也就是文字叠加,然后再实现根据总文字的长度进行自动换行叠加文字
importjavax.imageio.ImageIO;importjava.awt.*;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.FileOutputStream;
/*** Created by uchoice on /11/25.*/public classMyTest {
/*** 图片添加水印*@paramsrcImgPath需要添加水印的图片的路径*@paramoutImgPath添加水印后图片输出路径*@parammarkContentColor水印文字的颜色*@paramfontSize文字大小*@paramwaterMarkContent水印的文字*/public voidwaterPress(String srcImgPath, String outImgPath, Color markContentColor,intfontSize, String waterMarkContent) {try{// 读取原图片信息File srcImgFile =newFile(srcImgPath); Image srcImg = ImageIO.read(srcImgFile);intsrcImgWidth = srcImg.getWidth(null);intsrcImgHeight = srcImg.getHeight(null);// 加水印BufferedImage bufImg =newBufferedImage(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 =newFont("宋体", 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 =newStringBuffer();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 =newFileOutputStream(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); } }