好些时候没发表文章了,由于最近有点忙,又更兼qiucode
站点页面大改,新版页面也较旧版整洁多了!那具体该是如何实现呢?(言外之意无非就是程序怎么实现的),其实无非就是将MultipartFile
对象进行二次处理(这里所说的处理就是在上传的原图的基础上添加水印),二次处理好了的图片远程存储到阿里云oss存储对象中。
好些时候没发表文章了,由于最近有点忙,又更兼qiucode
站点页面大改,新版页面也较旧版整洁多了!
好了,废话少扯,切入正题,别把本文所讲的主题偏离了。先看下最终实现的效果图吧:
效果图也看了,那具体该是如何实现呢?(言外之意无非就是程序怎么实现的),其实无非就是将MultipartFile
对象进行二次处理(这里所说的处理就是在上传的原图的基础上添加水印),二次处理好了的图片远程存储到阿里云oss存储对象中。
首先得先在pom.xml
文件中引入阿里云OSS对象存储的SDK
依赖jar,具体如下:
pom.xml文件添加阿里云OSS SDK依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.5.0</version>
</dependency>
OSSClientUtil工具类
/*由于篇幅有限,若实在需要OSSClientUtil类的话,可添加笔者QQ:2834491983 备注:qiucode.cn 图片添加水印
本文只贴出与本文相关的核心代码*/
public String uploadImg2Oss(MultipartFile file) {
if (file.getSize() > 1024 * 1024) {
throw new ImgException("上传图片大小不能超过1M!");
}
String originalFilename = file.getOriginalFilename();
String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
Random random = new Random();
String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
try {
InputStream inputStream = file.getInputStream();
//2020-09-05 11:06 添加水印后再上传
int lastSplit = originalFilename.lastIndexOf(".");
String suffix = originalFilename.substring(lastSplit + 1);
Image img = ImageIO.read(inputStream);
// 加图片水印
int imgWidth = img.getWidth(null);
int imgHeight = img.getHeight(null);
BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight,
BufferedImage.TYPE_INT_RGB);
//设置字体
int size=bufImg.getWidth()/16;
Font font = new Font("宋体", Font.PLAIN, size);
WordWaterMarker.markWord(bufImg, img, CommonConst.WATER_WORD, font ,size, Color.DARK_GRAY, imgWidth, imgHeight);
ByteArrayOutputStream bs = new ByteArrayOutputStream();
ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
ImageIO.write(bufImg, suffix, imOut);
InputStream is = new ByteArrayInputStream(bs.toByteArray());
//添加水印 end
//this.uploadFile2OSS(inputStream, name);
this.uploadFile2OSS(is, name);
return name;
} catch (Exception e) {
throw new ImgException("图片上传失败");
}
}
添加水印WaterMarker工具类
package cn.qiucode.blog.utils.watermarker;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* @program: qiucode-blog
* @description: 对图片进行处理 添加水印
* @author: 上官江北
* @create: 2020-09-05 14:16
*/
public class WordWaterMarker {
/**
* 加文字水印
* @param bufImg --BufferedImage 用来画图的宽高跟需要加水印的图片一样的空白图
* @param img --需要加水印的图片
* @param text --水印文字
* @param font --字体
* @param size --字体大小
* @param color --颜色
* @param imgWidth --图片宽度
* @param imgHeight --图片高度
* @param --水印相对于底片的x轴坐标(PS:左上角为(0,0))
* @param --水印相对于底片的y轴坐标(PS:左上角为(0,0))
* @author 上官江北
* @version 2019年01月29日 下午22:55:57
*/
public static void markWord(BufferedImage bufImg, Image img, String text, Font font,int size, Color color, int imgWidth, int imgHeight) {
//取到画笔
Graphics2D g = bufImg.createGraphics();
//画底片
g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);
g.setColor(color);
g.setBackground(Color.BLACK);
g.setFont(font);
// 设置水印文字透明度
g.setComposite (AlphaComposite.getInstance (AlphaComposite.SRC_ATOP, 0.190f));
//位置
//g.drawString(text, x, y);
int x = -imgWidth / 2;
int y = -imgHeight / 2;
int markWidth = size * getLength(text);// 字体长度
int markHeight = size;// 字体高度!
// 设置水印旋转
g.rotate (Math.toRadians (-40), (double) bufImg.getWidth () / 2, (double) bufImg.getHeight () / 2);
// 循环添加水印
while (x < imgWidth * 1.5) {
y = -imgHeight / 2;
while (y < imgHeight * 1.5) {
//g.rotate(30 * Math.PI / 180);
g.drawString (text, x, y);
y += markHeight + 80;
}
x += markWidth + 80;
}
g.dispose();
}
/**
* 获取字符长度,一个汉字作为 1 个字符, 一个英文字母作为 0.5 个字符
* @param text
* @return 字符长度,如:text="中国",返回 2;text="test",返回 2;text="中国ABC",返回 4.
*/
public static int getLength(String text) {
int textLength = text.length();
int length = textLength;
for (int i = 0; i < textLength; i++) {
if (String.valueOf(text.charAt(i)).getBytes().length > 1) {
length++;
}
}
return (length % 2 == 0) ? length / 2 : length / 2 + 1;
}
}
最后在Controller中调用就好了
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> upload(HttpServletRequest request)
throws IllegalStateException, IOException {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
Map<String ,Object> result=new HashMap<String ,Object>();
// 判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
// 转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
// 取得上传文件
MultipartFile f = multiRequest.getFile(iter.next());
if (f != null) {
String name=ossClientUtil.uploadImg2Oss(f);
String imgUrl = ossClientUtil.getImgUrl(name);
result.put("success",1);
result.put("message","上传成功");
result.put("url",imgUrl);
}
}
}else{
result.put("success",0);
result.put("message","上传失败");
}
System.out.println(result.toString());
return result;
}
到这里,对上传图片进行二次处理(添加水印)后远程存储阿里云OSS对象存储中,就告一段落了,本文所贴出的代码均为核心实现的代码,若需完整代码,可在评论区留下您的联系方式,笔者好把本文相关的整理好打包发给您!