java实现给图片添加水印(文字水印或图片水印)
以下代码是为了实现,在上传图片时对其进行压缩,加文字或图片水印,最后再将处理好的图片url返回给前端,话不多少直接上源码。
//前端代码
export function uploadArtWork(file, fileType, title){
return new Promise((resolve, reject) => {
let url = window.baseUrl+'/project/client/file/fileUploadCompressUser';
let userId = getUserId();
let formData = {
modular: 'art_'+fileType,
usedFileUrl: '',
width: 1000,
userId: userId,
title: title,
voteCofigId:tempArtCfg.cfgId
}
uni.uploadFile({
url: url,
name: 'file',
formData,
file:file,
success: (result => {
let data = JSON.parse(result.data);
if(data.code == 200){
let url = data.data;
resolve(url)
}else{
uni.hideLoading();
uni.showModal({
title:'提示',
content:data.msg,
showCancel:false,
});
}
}),
fail: (result => {
reject(result)
})
})
})
}
//Cotorller层调用
@Log("上传文件压缩处理")
@PostMapping(value = "/fileUploadCompressUser")
public ResponseEntity<R> fileUploadCompressUser(@RequestParam(name = "width", required = false) Integer width,
@RequestParam(name = "usedFileUrl", required = false) String usedFileUrl,
@RequestParam(name = "modular",required = false) String modular,
@RequestParam(name = "file") MultipartFile file,
@RequestParam(name = "title",required = false) String title,
@RequestParam(name = "userId",required = false) Long userId,
@RequestParam(name = "voteCofigId",required = false) Long voteCofigId) throws Exception {
R result = null;
UserInfo me = userInfoRepository.get(userId,UserInfo.class);
String username = me.getUsername();
String mobile = me.getMobile();
//判断是否图片,图片走压缩,
String originalFilename = file.getOriginalFilename();
String format=originalFilename.subSequence(originalFilename.lastIndexOf(".") + 1, originalFilename.length()).toString();
List<Map<String,Object>> voteCofigList = voteConfigRepository.findMapByNativeSql("SELECT video_size videoSize,is_water_mark isWaterMark,text_watermark textWatermark,image_watermark imageWatermark FROM vote_config WHERE id = :voteCofigId",new HashMap<String, Object>(){{
put("voteCofigId",voteCofigId);
}});
if("jpg".equals(format) || "png".equals(format) || "jpeg".equals(format) ||"gif".equals(format)){
if(voteCofigList.get(0).size()>0){
Boolean isWaterMark = Boolean.parseBoolean(voteCofigList.get(0).get("isWaterMark").toString());
//如果需要添加水印
if(isWaterMark){
//从数据库中取文字水印或者图片水印(url)的值
String textWatermark = voteCofigList.get(0).get("textWatermark")!=null?voteCofigList.get(0).get("textWatermark").toString():null;
String imageWatermark = voteCofigList.get(0).get("imageWatermark")!=null?voteCofigList.get(0).get("imageWatermark").toString():null;
file = ImageUtil.addWatermark(textWatermark,imageWatermark,file);
}
}
}else{
String type = modular.substring(modular.lastIndexOf("_")+1);
if(type.equals("video")){
//如果有规定视频的大小不大于多少
if(voteCofigList.get(0).size()>0){
Integer videoSize = Integer.parseInt(voteCofigList.get(0).get("videoSize").toString());
return new ResponseEntity<>(VideoUtil.limitVideoCapacity(videoSize,file.getSize()), HttpStatus.OK);
}
}
width = 0;
return fileUploadUser(width,usedFileUrl,modular,file,title,userId);
}
Map<String, Map<String, Object>> fileList = getFileUploadService().fileUploadCompressUser(file, width, title, username, mobile);
Map<String, Object> r = new HashMap<>();
R r1 = new R();
String fileUrl = "";
String realUrl = "";
for (int i=1;i<=fileList.size();i++){
Map<String, Object> map = fileList.get("fileName" + i);
fileUrl = (String) map.get("realUrl");
if (i!=1) realUrl = (String) map.get("realUrl");
if (!"".equals(fileUrl) && fileUrl != null) {
r.put("url"+i,fileUrl);
OssFileList ossFileList = getOssFileList(modular, map, fileUrl);
ossFileListService.create(ossFileList);
ossFileListService.deleteInvalidFile(usedFileUrl);
} else {
result = R.fail("文件上传失败");
return new ResponseEntity<>(result, HttpStatus.OK);
}
}
// result = R.ok(fileUrl);
r1.setData(realUrl);
r1.setCode(200);
r1.setMsg("文件上传成功");
return new ResponseEntity<>(r1, HttpStatus.OK);
}
package com.yuqiaotech.utils;
import com.yuqiaotech.fileUpload.FileUploadUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 图片工具
*/
@Component
public class ImageUtil {
@Autowired
FileUploadUtils fileUploadUtils;
public static MultipartFile addWatermark(String textWatermark,String imageWatermark,MultipartFile file){
// 读取原图片信息 得到文件
File srcImgFile = FileUtil.toFile(file);
//将文件对象转化为图片对象
Image srcImg = null;
try {
srcImg = ImageIO.read(srcImgFile);
} catch (IOException e) {
e.printStackTrace();
}
//获取图片的宽
int srcImgWidth = srcImg.getWidth(null);
//获取图片的高
int srcImgHeight = srcImg.getHeight(null);
BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
// 加水印
//创建画笔
Graphics2D graphics2D = bufImg.createGraphics();
//绘制原始图片
graphics2D.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
//如果文字水印有值,就将其绘制在图的中间
if(StringUtils.isNotEmpty(textWatermark)){
addTextWatermark(graphics2D,srcImgWidth,srcImgHeight,textWatermark);
}else if(StringUtils.isNotEmpty(imageWatermark)){
//如果图片水印有值,就将其绘制在图的右下角
addImageWatermark(graphics2D,srcImgWidth,srcImgHeight,imageWatermark,4);
}
// //待存储的地址--测试用的
// String tarImgPath="C:/Users/Administrator/Desktop/tx.png";
// 输出图片
// FileOutputStream outImgStream = null;
ByteArrayOutputStream os = null;
MultipartFile multipartFile = null;
try {
// outImgStream = new FileOutputStream(tarImgPath);
// ImageIO.write(bufImg, "png", outImgStream);
//创建一个ByteArrayOutputStream
os = new ByteArrayOutputStream();
//把BufferedImage写入ByteArrayOutputStream
//此处要写PNG否则可能会出现遮罩层
ImageIO.write(bufImg, "png", os);
//ByteArrayOutputStream转成InputStream
InputStream input = new ByteArrayInputStream(os.toByteArray());
multipartFile =new MockMultipartFile("file", "file.png", "text/plain", input);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os) {
os.close();
}
// if (null != outImgStream) {
// outImgStream.flush();
// outImgStream.close();
// }
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return multipartFile;
}
public static void addTextWatermark(Graphics2D graphics2D,int srcImgWidth,int srcImgHeight,String textWatermark){
//-------------------------文字水印 start----------------------------
//根据图片的背景设置水印颜色
graphics2D.setColor(new Color(255,255,255,128));
//设置字体 画笔字体样式为微软雅黑,加粗,文字大小为60pt
graphics2D.setFont(new Font("微软雅黑", Font.BOLD, 30));
//设置水印的坐标(为原图片中间位置)
//textWatermark为水印内容
int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D)) / 2;
int y=srcImgHeight / 2;
//画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
graphics2D.drawString(textWatermark, x, y);
graphics2D.dispose();
//-------------------------文字水印 end----------------------------
}
public static void addImageWatermark(Graphics2D graphics2D,int srcImgWidth,int srcImgHeight,String imageWatermark,int type){
//-------------------------图片水印 start----------------------------
//水印文件
//创建一个URL对象,获取网络图片的地址信息(网络图片)
URL url = null;
//将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)
Image srcWaterMark = null;
try {
url = new URL(imageWatermark);
srcWaterMark = ImageIO.read(url.openStream());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//设置 alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
//x,y为章需要合成到A图片上的位置坐标,w,h为将章缩小到多少长宽比例
//注意这行代码:graphics2D.drawlmage(img, x, y, w, h, null);
//绘制水印图片 坐标为自己选择
int x = 0;
int y = 0;
int width = (int)(srcImgWidth*0.1);
int height = (int)(srcImgWidth*0.1);
if (type == 1) {
//覆盖图片位于左上角
x = 0;
y = 0;
} else if (type == 2) {
//覆盖图片位于右上角
x = srcImgWidth - width;
y = 0;
} else if (type == 3) {
//覆盖图片位于左下角
x = 0;
y = srcImgHeight - height;
} else if (type == 4) {
//覆盖图片位于右下角
x = srcImgWidth - width;
y = srcImgHeight - height;
} else if (type == 5 ){
//覆盖图片位于中间
x = (srcImgWidth - width) / 2;
y = (srcImgWidth - height) / 2;
}
graphics2D.drawImage(srcWaterMark, x, y ,width, height, null);
// 水印文件结束
graphics2D.dispose();
//-------------------------图片水印 end----------------------------
}
/**
* 获取水印文字的长度
* @param waterMarkContent
* @param graphics2D
* @return
*/
public static int getWatermarkLength(String waterMarkContent, Graphics2D graphics2D) {
return graphics2D.getFontMetrics(graphics2D.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
}
}
java实现给图片添加水印(文字水印或图片水印)
原文是这位作者的,调理清晰且很好用!