package com.tgpms.utils;import cn.hutool.core.util.StrUtil;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;/*** 图片添加水印** @author jiangli* @since 2021/3/11 8:23*/
public class WaterMarkUtil {// 用来调整水印的间距private static final int space = 20;/*** * @param srcImgFile 待添加水印的图片* @param outImgPath 添加完成的输出路径* @param markContentColor 文字颜色* @param waterMarkContent 水印内容, 需要换行用||连接*/public static void drawCaterMark(File srcImgFile, String outImgPath, Color markContentColor, String waterMarkContent) {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);java.util.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);//左上角
//                g.drawString(s, space, i * tempY + 2 * space);//右下角g.drawString(s, space, srcImgHeight - (waterMarkContentList.size() - i) * tempY + space);}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 int getCharLen(char c, Graphics2D g) {return g.getFontMetrics(g.getFont()).charWidth(c);}/*** 获取水印文字总长度** @param waterMarkContent 水印的文字* @param g                绘图方法* @return 水印文字总长度*/public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());}
}

使用

    /*** 新增新建管网信息管道*/@ApiOperation(value = "新增新建管网信息管道", notes = "新增新建管网信息管道", httpMethod = "POST")@PostMapping(value = "/tofly-sxgk/newpspipe", headers = "content-type=multipart/form-data")public Result addNewpspipe(@RequestParam(value = "newpspipe") String jsonString,@RequestParam String waterMarkContent, HttpServletRequest request) {InLineParts inLineParts = JSONUtil.toBean(jsonString, InLineParts.class);List<MultipartFile> files = new ArrayList<>();// 获取文件集合MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();if (CollectionUtil.isNotEmpty(fileMap)) {for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {// 获取单个文件MultipartFile mf = entity.getValue();files.add(mf);}}// 临时文件,最后要删除List<File> images = new ArrayList<>();try {// 发送给同飞的参数Map<String, Object> paramMap = new HashMap<>();if (CollectionUtil.isNotEmpty(inLineParts.getNewpspipefileList())) {List<Newpspipefile> newpspipefileList = inLineParts.getNewpspipefileList();for (int i = 0; i < newpspipefileList.size(); i++) {Newpspipefile newpspipefile = newpspipefileList.get(i);paramMap.put("newpspipefileList[" + i + "].fileName", newpspipefile.getFileName());paramMap.put("newpspipefileList[" + i + "].distance", newpspipefile.getDistance());paramMap.put("newpspipefileList[" + i + "].latitude", newpspipefile.getLatitude());paramMap.put("newpspipefileList[" + i + "].longitude", newpspipefile.getLongitude());paramMap.put("newpspipefileList[" + i + "].sxCoor", newpspipefile.getSxCoor());paramMap.put("newpspipefileList[" + i + "].syCoor", newpspipefile.getSyCoor());File image = MultipartFileToFile.multipartFileToFile(files.get(i));// 添加水印(MultipartFile要转换成File,生成的带水印的图片替换掉原来的临时图片,临时图片最后删除)CaterMarkUtil.drawCaterMark(image,image.getPath(), Color.red,waterMarkContent);paramMap.put(newpspipefile.getFileName(), image);images.add(image);}}// 调用同飞修改接口paramMap.putAll(BeanUtil.beanToMap(inLineParts, false, true));paramMap.remove("newpspipefileList");String token = request.getHeader("tfToken");String body = HttpRequest.post(PropertiesUtil.HOST + tongFeiUrl.getNewpspipe()).header(Header.AUTHORIZATION, "Bearer " + token).header(Header.CONTENT_TYPE, "multipart/form-data").form(paramMap).execute().body();R r = JSON.parseObject(body, R.class);return CommonMethods.tongFeiResponseToResult(r);} catch (Exception e) {e.printStackTrace();return Result.error(e.getMessage());} finally {MultipartFileToFile.delteTempFile(images);}}

java图片添加水印实现自动换行相关推荐

  1. Java图片添加水印工具

    Java图片添加水印工具 废话少说,直接上代码: import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font ...

  2. java 图片添加水印工具

    图片添加水印工具类 /** * * */ package utils;import com.util.UnicodeReader;import javax.imageio.ImageIO; impor ...

  3. Java图片添加水印功能

    图片添加水印 需求是需要添加多个斜的水印,如果只是添加单个水印可以参考这个:传送门 直接上代码: private static void waterMarkAdd(String sourceFile, ...

  4. java图片添加水印文字

    jAVA图片中添加文字水印(铺满整个图片) package com.zhuozhengsoft.mark; import java.awt.AlphaComposite; import java.aw ...

  5. java 图片添加水印(文字水印+图片水印)

    一.图片水印(水印文件覆盖到源文件上) /*** @param buffImg 源文件(BufferedImage)* @param waterImg 水印文件(BufferedImage)* @pa ...

  6. java生成水印_(Java)图片添加水印,生成邀请函

    用途说明: 1.可以用于生成自定义的水印 2.可以动态生成邀请函,指定特定对象的姓名.内容 3.可以生成手写书信(这个下载对应的手写字体,安装到电脑就可用了) 源码的功能: 1.提供自定义字体属性(样 ...

  7. java 给图片添加暗水印_java 实现给图片添加水印

    原图如下: 代码如下: package test; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Fon ...

  8. JAVA给图片添加水印,java初级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  9. java实现word,pdf,excel,图片添加水印

    gitee项目地址:https://gitee.com/betelnutandwine/meutilswatermark: java实现pdf,word,excel,ppt,图片加水印 jar地址:s ...

最新文章

  1. Python从入门到精通 - 入门篇 (下)
  2. python中and与or的执行顺序-python 代码运行顺序问题?
  3. NSInteger与int的区别
  4. map 和set 有什么区别,分别又是怎么实现的
  5. 视频大时代下基础架构的演进
  6. Dynagen0.11+Pemuwrapper入手麻烦二三事——告诉初学者直路
  7. 前端学习(686):for循环
  8. 如何用Linux命令行管理网络:11个你必须知道的命令
  9. 给定一个整数数组,判断是否存在重复元素。
  10. CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)
  11. 华三交换机配置vrrp_h3c vrrp配置实例
  12. 百度快排(百度下拉)刷词原理是什么?
  13. 柳州铁一中机器人_柳州铁路第一中学的办学成果
  14. 盗版xp成功验证成正版,享受正版增值服务!
  15. 未来已来,云上安全SaaS化势不可挡
  16. 移动端切图内容包括什么_移动端切图备忘
  17. python画彩色螺旋线图
  18. Network Battery for mac(实时网速显示和电池健康) 教程
  19. 抽象代数之A3是S3的全不变子群
  20. 艾美捷ALC-0159基本参数文献参考

热门文章

  1. 双击背面截图_怎么双击背面截图
  2. C语言的面向对象设计-对X264/FFMPEG架构探讨 分享
  3. 有测试ipad英寸的软件吗,差距有多大?三款9.7英寸苹果iPad跑分测试
  4. 设计模式--单例模式--静态内部类和枚举单例
  5. 本月,我最推荐的医疗保险排行榜
  6. SQL中的排序和分组
  7. java 找出所有水仙花数,java兑现找出所有的水仙花数
  8. View最拿手的是吹
  9. liunx系统下 锐捷使用以及虚拟拨号教程
  10. 如何提高个人领导力?