1秒实现Springboot 图片添加水印功能
作者:小目标青年 发布时间:2022-07-21 04:30:59
标签:springboot,图片,水印
前言
真的一秒就可以实现么?
是的,因为我们直接复制粘贴工具类拿来用就可以。
工具类 WaterMarkUtil.java
package com.example.dotest.util;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;
/**
* 图片水印工具类
*
*/
public class WaterMarkUtil {
// 水印透明度
private static final float alpha = 0.8f;
// 水印横向位置
private static int positionWidth = 100;
// 水印纵向位置
private static int positionHeight = 300;
// 水印文字字体
private static final Font font = new Font("宋体", Font.BOLD, 30);
// 水印文字颜色
private static final Color color = Color.white;
/**
* 给图片添加水印文字
*
* @param text 水印文字
* @param srcImgPath 源图片路径
* @param targetPath 目标图片路径
*/
public static void markImage(String text, String srcImgPath, String targetPath) {
markImage(text, srcImgPath, targetPath, null);
}
/**
* 给图片添加水印文字、可设置水印文字的旋转角度
*
* @param text
* @param srcImgPath
* @param targetPath
* @param degree
*/
public static void markImage(String text, String srcImgPath, String targetPath, Integer degree) {
OutputStream os = null;
try {
// 0、图片类型
String type = srcImgPath.substring(srcImgPath.indexOf(".") + 1, srcImgPath.length());
// 1、源图片
Image srcImg = ImageIO.read(new File(srcImgPath));
int imgWidth = srcImg.getWidth(null);
int imgHeight = srcImg.getHeight(null);
BufferedImage buffImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
// 2、得到画笔对象
Graphics2D g = buffImg.createGraphics();
// 3、设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(srcImg.getScaledInstance(imgWidth, imgHeight, Image.SCALE_SMOOTH), 0, 0, null);
// 4、设置水印旋转
if (null != degree) {
g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
}
// 5、设置水印文字颜色
g.setColor(color);
// 6、设置水印文字Font
g.setFont(font);
// 7、设置水印文字透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
positionWidth = 50;
positionHeight = imgHeight-30;
g.drawString(text,positionWidth, positionHeight);
// 9、释放资源
g.dispose();
// 10、生成图片
os = new FileOutputStream(targetPath);
// ImageIO.write(buffImg, "JPG", os);
ImageIO.write(buffImg, type.toUpperCase(), os);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os){
os.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 给图片添加水印文字、可设置水印文字的旋转角度
* @param text
* @param inputStream
* @param outputStream
* @param degree
* @param typeName
*/
public static void markImageByIO(String text, InputStream inputStream, OutputStream outputStream,
Integer degree, String typeName) {
try {
// 1、源图片
Image srcImg = ImageIO.read(inputStream);
int imgWidth = srcImg.getWidth(null);
int imgHeight = srcImg.getHeight(null);
BufferedImage buffImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
// 2、得到画笔对象
Graphics2D g = buffImg.createGraphics();
// 3、设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(srcImg.getScaledInstance(imgWidth, imgHeight, Image.SCALE_SMOOTH), 0, 0, null);
// 4、设置水印旋转
if (null != degree) {
g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
}
// 5、设置水印文字颜色
g.setColor(color);
// 6、设置水印文字Font
g.setFont(font);
// 7、设置水印文字透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
g.drawString(text, positionWidth, positionHeight);
// 9、释放资源
g.dispose();
// 10、生成图片
ImageIO.write(buffImg, typeName.toUpperCase(), outputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String srcImgPath = "D:\\testSmile.jpg";
String text = "JCccc";
// 给图片添加水印文字
markImage(text, srcImgPath, "D:\\testSmileWithMark.jpg");
// 给图片添加水印文字,水印文字旋转-45
markImage(text, srcImgPath, "D:\\testSmileWithMarkRotate.jpg", -45);
System.out.println("给图片添加水印文字完毕");
}
}
然后准备一张图:
未加水印前:
然后调用里面的函数即可:
public static void main(String[] args) {
String srcImgPath = "D:\\testSmile.jpg";
String text = "JCccc";
// 给图片添加水印文字
markImage(text, srcImgPath, "D:\\testSmileWithMark.jpg");
// 给图片添加水印文字,水印文字旋转-45
markImage(text, srcImgPath, "D:\\testSmileWithMarkRotate.jpg", -45);
System.out.println("给图片添加水印文字完毕");
}
简析:
调用一下可以看到水印图片出来了:
看下效果:
其余:
来源:https://blog.csdn.net/qq_35387940/article/details/128225444


猜你喜欢
- Java 8支持动态语言,看到了很酷的Lambda表达式,对一直以静态类型语言自居的Java,让人看到了Java虚拟机可以支持动态语言的目标
- 本文实例为大家分享了java实现webservice方式的具体代码,供大家参考,具体内容如下经过测试 jdk1.6.10以下会出现bug 建
- 如果还不知道DecorView,那也没有什么关系 ^_^先来看看实现的效果实现的大致思路首先需要明白什么是DecorView,他是andro
- 本文介绍了Java开发过程中日期相关操作,分享的代码如下:package jse;import java.io.UnsupportedEnc
- Result也是Struts2比较重要的一部分,在Result的配置中常用的有四种类型:dispatcher、redirect、chain和
- Java List 用法实例详解Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解
- Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换简单修改,完成自己想要的功能:长按,移到垃圾桶,删除数据。主
- PS:公司的业务中有个超级大的作业就是把OFFICE文档转成PDF,我猜之前没程序猿们,公司那些人应该是一个个手动转。强烈为猿们感叹,帮你们
- 最新Android版本、API级别与代号对应关系代号版本号API/NDK级别发布时间-O8.0API level 262017-3-21牛轧
- 概述本文介绍 Spring Boot 项目中整合 ElasticSearch 并实现 CRUD 操作,包括分页、滚动等功能。添加Maven依
- 什么是NIO?线程在处理数据时,如果线程还处于将数据从channel读到buffer的这段时间内,线程可以去做别的事情,等数据都读到buff
- 项目结构src com servletdemo
- 公钥与私钥公钥与私钥是成对的,一般的,我们认为的是公钥加密、私钥解密、私钥签名、公钥验证,有人说成私钥加密,公钥解密时不对的。公钥与私钥的生
- 在 APK 开发中,通过 Java 代码来打开系统的安装程序以安装 APK 并不是什么难事,一般的 Android 系统都有开放这一功能。但
- 该配置基于IDEA2020.1版本,如后续有版本更新或者配置变更,再更新idea64.exe.vmoptions配置为提供IDEA启动速度和
- 原理:创建一个新的Bitmap,然后再根据它来创建一个Canvas,最后调用View的draw方法将View画到Canvas上,这样得到的B
- 在客户端中,为了防止界面假死状态,或者不能拖动界面,可以使用BackgroundWorker。1.在界面上拖动一个BackgroundWor
- 本文实例分析了java遍历Map的几种方法。分享给大家供大家参考,具体如下:Java代码:Map<String,String>
- c# label的内容显示不全,需要设置如下属性即可:1、将Lable的font属性的字体改成宋体;2、将AutoSize属性改成true;
- 前言表单提交是最常见的数据提交方式,我们经常会填写表单信息,比如用户名,身份证,手机号等等,因此就会产生身份证是否合法,用户名是否为空,虽然