适用于将图片上传至服务器时添加图片水印或者文字水印
工具类
import org.springframework.mock.web.MockMultipartFile; 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.*; public class ImageUtil { /** * 给multipartFile加上图片水印 * @param multipartFile 需要上传的文件 * @param markImg 本地水印绝对路径 * @throws IOException */ public static MultipartFile addPicMarkToMutipartFile(MultipartFile multipartFile, String markImg) throws IOException { // 获取图片文件名 String originFileName = multipartFile.getOriginalFilename(); // 获取原图片后缀 int lastSplit = originFileName.lastIndexOf("."); String suffix = originFileName.substring(lastSplit + 1); // 获取图片原始信息 String dOriginFileName = multipartFile.getOriginalFilename(); String dContentType = multipartFile.getContentType(); // 是图片且不是gif才加水印 if (!suffix.equalsIgnoreCase("gif")) { // 获取水印图片 InputStream inputImg = multipartFile.getInputStream(); Image img = ImageIO.read(inputImg); File file = new File(markImg); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); Image mark = ImageIO.read(bis); // 加图片水印 int imgWidth = img.getWidth(null); int imgHeight = img.getHeight(null); int markWidth = mark.getWidth(null); int markHeight = mark.getHeight(null); BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); //水印的相对位置 ps:这里是右下角 水印宽为底片的四分之一 位置自己可以调整 markPic(bufImg, img, mark, imgWidth / 4, (imgWidth * markHeight) / (4 * markWidth), imgWidth - imgWidth / 4, imgHeight - (imgWidth * markHeight) / (4 * markWidth)); ByteArrayOutputStream bs = new ByteArrayOutputStream(); ImageOutputStream imOut = ImageIO.createImageOutputStream(bs); ImageIO.write(bufImg, suffix, imOut); InputStream is = new ByteArrayInputStream(bs.toByteArray()); // 加水印后的文件上传 multipartFile = new MockMultipartFile(dOriginFileName, dOriginFileName, dContentType, is); } //返回加了水印的上传对象 return multipartFile; } /** * 给multipartFile加上文字水印 * @param multipartFile 需要上传的文件 * @param text 需要添加的水印文字 * @throws IOException */ public static MultipartFile addWorkMarkToMutipartFile(MultipartFile multipartFile, String text) throws IOException { // 获取图片文件名 String originFileName = multipartFile.getOriginalFilename(); // 获取原图片后缀 int lastSplit = originFileName.lastIndexOf("."); String suffix = originFileName.substring(lastSplit + 1); // 获取图片原始信息 String dOriginFileName = multipartFile.getOriginalFilename(); String dContentType = multipartFile.getContentType(); // 是图片且不是gif才加水印 if (!suffix.equalsIgnoreCase("gif")) { // 获取水印图片 InputStream inputImg = multipartFile.getInputStream(); Image img = ImageIO.read(inputImg); // 加图片水印 int imgWidth = img.getWidth(null); int imgHeight = img.getHeight(null); BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); //设置字体 Font font = new Font("宋体", Font.PLAIN, 5); //调用画文字水印的方法 markWord(bufImg, img, text, font , Color.RED, 0, imgHeight-50); ByteArrayOutputStream bs = new ByteArrayOutputStream(); ImageOutputStream imOut = ImageIO.createImageOutputStream(bs); ImageIO.write(bufImg, suffix, imOut); InputStream is = new ByteArrayInputStream(bs.toByteArray()); // 加水印后的文件上传 multipartFile = new MockMultipartFile(dOriginFileName, dOriginFileName, dContentType, is); } //返回加了水印的上传对象 return multipartFile; } //加图片水印 public static void markPic(BufferedImage bufImg, Image img, Image markImg, int width, int height, int x, int y) { //取到画笔 Graphics2D g = bufImg.createGraphics(); //画底片 g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null); //画水印位置 g.drawImage(markImg, x, y, width, height, null); g.dispose(); } //加文字水印 public static void markWord(BufferedImage bufImg, Image img, String text, Font font, Color color, int x, int y) { //取到画笔 Graphics2D g = bufImg.createGraphics(); //画底片 g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null); g.setColor(color); g.setFont(font); //位置 g.drawString(text, x, y); g.dispose(); } } controller import com.changgou.entity.Result; import com.changgou.entity.StatusCode; import com.changgou.file.util.FastDFSClient; import com.changgou.file.util.FastDFSFile; import com.changgou.file.util.ImageUtil; import org.apache.commons.lang.StringUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping("/file") public class FileController { private static String markImg = "D:\\logo.jpg"; @PostMapping("/upload") public Result uploadFile(MultipartFile file){ try{ //判断文件是否存在 if (file == null){ throw new RuntimeException("文件不存在"); } //添加图片水印 file = ImageUtil.addPicMarkToMutipartFile(file, markImg); //添加文字水印 // file = addWorkMarkToMutipartFile(file, "study"); //获取文件的完整名称 String originalFilename = file.getOriginalFilename(); if (StringUtils.isEmpty(originalFilename)){ throw new RuntimeException("文件不存在"); } //获取文件的扩展名称 String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); //获取文件内容 byte[] content = file.getBytes(); //创建文件上传的封装实体类 FastDFSFile fastDFSFile = new FastDFSFile(originalFilename,content,extName); //基于工具类进行文件上传,并接受返回参数 String[] String[] uploadResult = FastDFSClient.upload(fastDFSFile); //封装返回结果 String url = FastDFSClient.getTrackerUrl()+uploadResult[0]+"/"+uploadResult[1]; return new Result(true,StatusCode.OK,"文件上传成功",url); }catch (Exception e){ e.printStackTrace(); } return new Result(false, StatusCode.ERROR,"文件上传失败"); } }