添加图片水印,换行
// 用来调整水印的间距
private static final int space = 5;
private static int getCharLen(char c, Graphics2D g) { return g.getFontMetrics(g.getFont()).charWidth(c); } /** * * @param srcImgFile 待添加水印的图片 * @param outImgPath 添加完成的输出路径 * @param markContentColor 文字颜色 * @param waterMarkContent 水印内容, 需要换行用||连接 */ public static void drawCaterMark(File srcImgFile, String outImgPath, Color markContentColor, String waterMarkContent,int topEmptySpace) { 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); int fontSize = srcImg.getWidth(null) / 300 * 10; Font font = new Font("微软雅黑", Font.PLAIN, fontSize); // 设置水印颜色 g.setColor(markContentColor); // 设置水印文字字体 g.setFont(font); // 抗锯齿 g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); List<String> waterMarkContentList = new ArrayList<>(); // 将换行后的文字放入新的集合 for (String markContent : waterMarkContents) { // 单字符长度 int tempCharLen = 0; // 单行字符总长度临时计算 int tempLineLen = 0; StringBuilder sb = new StringBuilder(); for (int i = 0; i < markContent.length(); i++) { char tempChar = markContent.charAt(i); tempCharLen = getCharLen(tempChar, g); tempLineLen += tempCharLen; // 文字长度大于图片宽度-2*间距-字体大小 if (tempLineLen > srcImgWidth - space * 2 - tempCharLen) { // 长度已经满一行 waterMarkContentList.add(sb.toString()); // 清空内容,重新追加 sb.delete(0, sb.length()); tempLineLen = 0; } // 追加字符 sb.append(tempChar); } waterMarkContentList.add(sb.toString()); } // 绘制水印 int tempY = fontSize + space; for (int i = 0; i < waterMarkContentList.size(); i++) { String s = waterMarkContentList.get(i); //左上角 System.out.println("x="+space+",y="+((i+1) * tempY + topEmptySpace)); g.drawString(s, space, (i+1) * tempY + topEmptySpace); } g.dispose(); // 输出图片 if (StrUtil.isNotBlank(outImgPath)) { FileOutputStream outImgStream = new FileOutputStream(outImgPath); ImageIO.write(bufImg, "jpg", outImgStream); outImgStream.flush(); outImgStream.close(); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { // 原图位置, 输出图片位置, 水印文字颜色, 水印文字 String font = "这是第一个水印||这是第二个水印||2020-05-27 17:00:00"; drawCaterMark(new File("C:\\Users\\ming\\Pictures\\2.jpg"), "C:\\Users\\ming\\Pictures\\\\2_mark.jpg", Color.red, font,0); }