整体思路如下 :

(删除了部分代码,不影响代码执行,根据实际情况进行调整)

  1. 获取需要打水印的图片
  2. 获取画布对象
  3. 设置水印属性
  4. 为图片画上水印数据
  5. 生成带水印的图片
  6. 返回路径
import cn.hutool.core.util.StrUtil;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.util.Date;public static String watermark(Date date, String address, String filePath) {logger.info("图片水印");// 旋转角度 可以自定义旋转度数Integer degree = 0;OutputStream os = null;// 文件路径String courseFile = getNewFilePath();StringBuilder watermarkImagePath = new StringBuilder();// 需要根据原图获取图片类型 默认jpgString imgType = "jpg";if (filePath.length() == 0) {return null;}String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);watermarkImagePath.append(courseFile).append("\\").append("watermark_").append(fileName);// 图片类型if (StrUtil.isNotBlank(fileName)) {String[] split = fileName.split("\\.");if (split.length > 1) {imgType = split[1];}}try {//  ImageIO.read(new URL(filePath));  读取 远程比如阿里云腾讯云的图片  需要用new URL 方法读取BufferedImage srcImage = ImageIO.read(new URL(filePath));//  读取本地图片用下面  此处要区分,否则会空指针//  BufferedImage srcImage = ImageIO.read(filePath);BufferedImage bufImage = new BufferedImage(srcImage.getWidth(null), srcImage.getHeight(null), BufferedImage.TYPE_INT_RGB);// 得到画布对象Graphics2D graphics2D = bufImage.createGraphics();// 设置对线段的锯齿状边缘处理graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2D.drawImage(srcImage.getScaledInstance(srcImage.getWidth(null), srcImage.getHeight(null), Image.SCALE_SMOOTH),0, 0, null);if (null != degree) {// 设置水印旋转角度及坐标graphics2D.rotate(Math.toRadians(degree), (double) bufImage.getWidth() / 3, (double) bufImage.getHeight() / 3);}// 透明度float alpha = 0.8f;// 字体样式String fontStyle = "SimSun";graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));// 字体大小  Font.PLAIN 正常字体   Font.BOLD  加粗字体 int fontSize =  srcImage.getWidth()/500*20;// 设置颜色和画笔粗细graphics2D.setColor(Color.white);graphics2D.setStroke(new BasicStroke(20));graphics2D.setFont(new Font(fontStyle, Font.PLAIN, fontSize));// 水印位置 根据自定义 注意  X Y  轴的定点是图片的左上角 //  X Y 轴的距离加上字体的大小会导致偏移不在正中心位置 需要根据情况加上或减去字体大小  不进行操作可能会导致字体重叠int x = (srcImage.getWidth(null)) / 2 - fontSize;int y = (int) ((srcImage.getHeight(null)) * 0.8);//  下方的代码控制水印的字体大小位置等    StringBuilder dateStr= new StringBuilder();if (date != null) {// 时间  重新设定字体 需要增大 加粗graphics2D.setStroke(new BasicStroke(20));graphics2D.setFont(new Font(fontStyle, Font.BOLD, fontSize+20));String time = DateUtil.getDate(date, "HH:mm");graphics2D.drawString(time,x-fontSize-20,y);}if (StrUtil.isNotBlank(address)) {// 加上字体的高度  否则字体会重叠 使用者根据情况加减y +=fontSize+20;graphics2D.drawString(address,x,y);}graphics2D.dispose();os = new FileOutputStream(watermarkImagePath.toString());// 生成图片 (可设置 jpg或者png格式)ImageIO.write(bufImage, imgType, os);} catch (Exception e) {e.printStackTrace();} finally {try {if (os != null) {os.close();}} catch (Exception e) {e.printStackTrace();}}// 返回图片路径return watermarkImagePath.toString();}// 获取当前项目文件路径private static String getNewFilePath() {String classPath = null;try {classPath = ResourceUtils.getURL("classpath:").getPath();} catch (FileNotFoundException e) {e.printStackTrace();}File newFile = new File(classPath, "static/image/");if (!newFile.exists()) {newFile.mkdirs();}return newFile.getAbsolutePath();}

Java生成动态生成水印图片,为图片打水印. Java为图片打水印相关推荐

  1. java 之动态生成类

    @TOCjava 之动态生成类 最近遇到一个需求,要求属性字段是可以前端动态编辑,然后要求导入导出的数据列要同步属性字段.导入导出功能不想自己写,想要集成好的现成工具.可是他是通过类注解获取属性的, ...

  2. java docx4j动态生成表格,保存为word,并通过Libreoffice转PDF

    缘起 最近客户要求把业务字段生成一个pdf,包含大量的表格,于是探究了两天版,终于找出一个比较完美的解决方案.本次采用的是docx4j,Libreoffice两个套件,docx4j本身有转PDF的功能 ...

  3. java swing 动态生成表格_6 个曾经牛逼哄哄的 Java 技术,你用过吗?

    大家好啊,今天给大家分享下我的开发历程中,我知道的那些被淘汰的技术或者框架,有些我甚至都没有用过,但我知道它曾经风光过. 废话不多说,下面我要开始吹了-- 1.Swing 下面这个是用 swing 开 ...

  4. java se 动态添加视图组件_博为峰Java技术题 ——JavaSE Java Swing在顶层容器中添加菜单栏Ⅰ...

    下面将讲述如何在顶层容器中添加菜单栏.下面将通过编写一段Swing程序代码来讲解如何在顶层容器中添加菜单栏.其代码如下: publicclassBWFSwingMenu { staticintwidt ...

  5. java icon动态变换,以编程方式自动更改ImageIcon [Java]

    I am making a simple game right now. When a JButton is clicked, the ImageIcon of a JLabel is suppose ...

  6. 【Python小工具】若干图片合并生成动态图(.gif)

    相信很多学生党.上班族在日常的学习.科研.办公中总会有一些比较特殊的需求,本人作为一个理工科(非计算机相关专业)学生和大家一样.有时好不容易找到了比较心仪的工具,却发现还要收费,质量和使用的便捷性也不 ...

  7. 动态生成JSP文件,并调用JSP程序

    2019独角兽企业重金招聘Python工程师标准>>> 下面这个JSP程序,动态生成可一个testDynamicInclude.inc.jsp,然后在后面调用它. 在JSP的动态生成 ...

  8. Java实现动态表单

    前提 我们的业务上会有各种各样的表单,常规的开发是一个表单,我们一般会在数据库里面建立一个对应的表,然后在代码中建立一个model与之对应,一旦建立好以后,就不能再对表单进行修改了,如果需要修改,就需 ...

  9. OSGI(面向Java的动态模型系统)和它的实现Equinox

    equinox  报错 英 ['ikwnks; 'ekw-] 美 ['ikwnɑks] 全球发音 跟读 口语练习 n. 春分:秋分:昼夜平分点 OSGi(Open Service Gateway In ...

最新文章

  1. Nature:如何做一篇肠道菌群免疫的顶级文章
  2. RAC对单实例DG redo大小日志修改
  3. 管家服务器未显示数据库启动,服务器受到后缀为gupwp的**,10年数据库等大神解救...
  4. Office协同办公:SkyDrive
  5. 全能终端神器 --- MobaXterm 、开启 linux 远程桌面
  6. 被定制化开发坑惨了的IT人,不是所有的报表都能满足老板的需求
  7. anaconda3安装_Ubuntu20.04安装配置Anaconda3
  8. swiper切换按钮位置改变_2019-01-18左右按钮控制swiper轮播图切换
  9. android烧写固定MAC,小系统SN号和MAC地址快速烧录的方法与流程
  10. MCDF 实验4 (1)
  11. Java三(运算符 )
  12. linux配置防火墙白名单(限制某个IP段)
  13. 【刷题日记】网易——瞌睡
  14. CV之FR:基于cv2和dlib库自带frontal_face_detector(人脸征检测器)利用landmarks.dat文件实现人脸检测与人脸标记之《极限男人帮》和《NBA全明星球员》案例应用
  15. 华为的鸿蒙河图名字,华为地图起名“河图”,再次震撼国人
  16. Linux上安装和使用git到gitoschina和github上_亲测
  17. 反垃圾邮件网关的选型标准考量录(1)
  18. 2021牛客暑期训练营1
  19. EMC VNX硬盘存储硬盘告警
  20. Educational Codeforces Round 113 (Rated for Div. 2) ABCD 解题思路

热门文章

  1. tomcat卸载不干净重新安装失败(check your settings and permissions)
  2. 2022春招面试题总结-C++方向
  3. 树莓派魔镜MagicMirror —— 2 烧写系统卡
  4. 百度地图JavaScript API GL—简易行政区划图层
  5. NPC/ANPC三电平调制方法和中点平衡算法
  6. dockerHomeassistant
  7. 渗透工具metasploit-auxiliary(scanner/portscan/syn)扫描端口服务
  8. php购物车接口,php购物车实现
  9. Arduino学习日记(1)——RC522板子的选择
  10. 电脑性能测试软件操作手册,PC性能测试完全指南.doc