@Test public void upload3 (){ String waterMarkContent="你好你是谁啊啊啊啊啊 你好你是谁啊啊啊啊啊啊啊啊啊啊啊啊 啊啊的方式发士 大夫是否地方是的防守打法是的你好你是谁啊啊啊啊啊 你好你是谁啊啊啊啊啊啊啊啊啊啊啊啊 啊啊的方式发士 大夫是否地方是的防守打法是的你好你是谁啊啊啊啊啊 你好你是谁啊啊啊啊啊啊啊啊啊啊啊啊 啊啊的方式发士 大夫是否地方是的防守打法是的"; //水印内容 String srcImgPath="http://192.168.12.135:10004/oss/941133960598392832/photo/1082582918142234624.jpg"; //源图片地址 new WaterMarkUtils().addWaterMark(waterMarkContent,srcImgPath); }
public class WaterMarkUtils { /* * @param 源图片路径 * @param 保存的图片路径 * @param 水印内容 * @param 水印颜色 * @param 水印字体 */ public static ByteArrayOutputStream addWaterMark(String waterMarkContent,String srcImgPath/*, String tarImgPath, String waterMarkContent,Color markContentColor,Font font*/) { try { int fontSize=30; Font font = new Font("微软雅黑", Font.PLAIN, fontSize); //水印字体 // String srcImgPath="http://192.168.12.135:10004/oss/941133960598392832/photo/1082582918142234624.jpg"; //源图片地址 // String tarImgPath="d:\\t.jpg"; //待存储的地址 //HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); //Color color=new Color(355,355,355,128); // 读取原图片信息 // File srcImgFile = new File(srcImgPath);//得到文件 URL url=new URL(srcImgPath); Image srcImg = ImageIO.read(url);//文件转化为图片 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); //g.setColor(color); //根据图片的背景设置水印颜色 g.setFont(font); g.setColor(Color.red);//设置字体 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.setBackground(Color.red); //设置水印的坐标 /* int x = srcImgWidth - 2*getWatermarkLength(waterMarkContent, g); int y = srcImgHeight - 2*getWatermarkLength(waterMarkContent, g);*/ /*int x = srcImgWidth - getWatermarkLength(waterMarkContent, g) - 3; int y = srcImgHeight - 3; g.drawString(waterMarkContent, x, y);*/ //画出水印 // g.drawString(waterMarkContent, srcImgWidth-20, srcImgHeight-30); g.drawString(sb.toString(), tempX, tempY);//最后叠加余下的文字 g.dispose(); //创建储存图片二进制流的输出流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { //创建ImageOutputStream流 ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(baos); //将二进制数据写进ByteArrayOutputStream ImageIO.write(bufImg, "jpg", imageOutputStream); } catch (IOException e) { e.printStackTrace(); } // 输出图片 /* FileOutputStream outImgStream = new FileOutputStream(tarImgPath); ImageIO.write(bufImg, "jpg", outImgStream); System.out.println("添加水印完成"); outImgStream.flush(); outImgStream.close();*/ return baos; } catch (Exception e) { // TODO: handle exception } return null; } public static int getWatermarkLength(String waterMarkContent, Graphics2D g) { return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length()); } public static int getCharLen(char c, Graphics2D g) { return g.getFontMetrics(g.getFont()).charWidth(c); } }