Java生成动态生成水印图片,为图片打水印. Java为图片打水印
整体思路如下 :
(删除了部分代码,不影响代码执行,根据实际情况进行调整)
- 获取需要打水印的图片
- 获取画布对象
- 设置水印属性
- 为图片画上水印数据
- 生成带水印的图片
- 返回路径
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为图片打水印相关推荐
- java 之动态生成类
@TOCjava 之动态生成类 最近遇到一个需求,要求属性字段是可以前端动态编辑,然后要求导入导出的数据列要同步属性字段.导入导出功能不想自己写,想要集成好的现成工具.可是他是通过类注解获取属性的, ...
- java docx4j动态生成表格,保存为word,并通过Libreoffice转PDF
缘起 最近客户要求把业务字段生成一个pdf,包含大量的表格,于是探究了两天版,终于找出一个比较完美的解决方案.本次采用的是docx4j,Libreoffice两个套件,docx4j本身有转PDF的功能 ...
- java swing 动态生成表格_6 个曾经牛逼哄哄的 Java 技术,你用过吗?
大家好啊,今天给大家分享下我的开发历程中,我知道的那些被淘汰的技术或者框架,有些我甚至都没有用过,但我知道它曾经风光过. 废话不多说,下面我要开始吹了-- 1.Swing 下面这个是用 swing 开 ...
- java se 动态添加视图组件_博为峰Java技术题 ——JavaSE Java Swing在顶层容器中添加菜单栏Ⅰ...
下面将讲述如何在顶层容器中添加菜单栏.下面将通过编写一段Swing程序代码来讲解如何在顶层容器中添加菜单栏.其代码如下: publicclassBWFSwingMenu { staticintwidt ...
- java icon动态变换,以编程方式自动更改ImageIcon [Java]
I am making a simple game right now. When a JButton is clicked, the ImageIcon of a JLabel is suppose ...
- 【Python小工具】若干图片合并生成动态图(.gif)
相信很多学生党.上班族在日常的学习.科研.办公中总会有一些比较特殊的需求,本人作为一个理工科(非计算机相关专业)学生和大家一样.有时好不容易找到了比较心仪的工具,却发现还要收费,质量和使用的便捷性也不 ...
- 动态生成JSP文件,并调用JSP程序
2019独角兽企业重金招聘Python工程师标准>>> 下面这个JSP程序,动态生成可一个testDynamicInclude.inc.jsp,然后在后面调用它. 在JSP的动态生成 ...
- Java实现动态表单
前提 我们的业务上会有各种各样的表单,常规的开发是一个表单,我们一般会在数据库里面建立一个对应的表,然后在代码中建立一个model与之对应,一旦建立好以后,就不能再对表单进行修改了,如果需要修改,就需 ...
- OSGI(面向Java的动态模型系统)和它的实现Equinox
equinox 报错 英 ['ikwnks; 'ekw-] 美 ['ikwnɑks] 全球发音 跟读 口语练习 n. 春分:秋分:昼夜平分点 OSGi(Open Service Gateway In ...
最新文章
- Nature:如何做一篇肠道菌群免疫的顶级文章
- RAC对单实例DG redo大小日志修改
- 管家服务器未显示数据库启动,服务器受到后缀为gupwp的**,10年数据库等大神解救...
- Office协同办公:SkyDrive
- 全能终端神器 --- MobaXterm 、开启 linux 远程桌面
- 被定制化开发坑惨了的IT人,不是所有的报表都能满足老板的需求
- anaconda3安装_Ubuntu20.04安装配置Anaconda3
- swiper切换按钮位置改变_2019-01-18左右按钮控制swiper轮播图切换
- android烧写固定MAC,小系统SN号和MAC地址快速烧录的方法与流程
- MCDF 实验4 (1)
- Java三(运算符 )
- linux配置防火墙白名单(限制某个IP段)
- 【刷题日记】网易——瞌睡
- CV之FR:基于cv2和dlib库自带frontal_face_detector(人脸征检测器)利用landmarks.dat文件实现人脸检测与人脸标记之《极限男人帮》和《NBA全明星球员》案例应用
- 华为的鸿蒙河图名字,华为地图起名“河图”,再次震撼国人
- Linux上安装和使用git到gitoschina和github上_亲测
- 反垃圾邮件网关的选型标准考量录(1)
- 2021牛客暑期训练营1
- EMC VNX硬盘存储硬盘告警
- Educational Codeforces Round 113 (Rated for Div. 2) ABCD 解题思路
热门文章
- tomcat卸载不干净重新安装失败(check your settings and permissions)
- 2022春招面试题总结-C++方向
- 树莓派魔镜MagicMirror —— 2 烧写系统卡
- 百度地图JavaScript API GL—简易行政区划图层
- NPC/ANPC三电平调制方法和中点平衡算法
- dockerHomeassistant
- 渗透工具metasploit-auxiliary(scanner/portscan/syn)扫描端口服务
- php购物车接口,php购物车实现
- Arduino学习日记(1)——RC522板子的选择
- 电脑性能测试软件操作手册,PC性能测试完全指南.doc