java实现给MultipartFile添加水印

接到一个新需求,上传图片后添加水印
先测试本地图片加水印


import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 給图片添加文字水印
 *
 *
 */
public class WaterMarkUtils {
    
    
    /**
     * @param args
     */
    public static void main(String[] args) {
    
    
        // 原图位置, 输出图片位置, 水印文字颜色, 水印文字

        try {
    
    
            // 读取原图片信息
            File srcImgFile = new File("C:/Users/Administrator/Desktop/测试用图/2.jpg");
            Image srcImg = ImageIO.read(srcImgFile);
            int srcImgWidth = srcImg.getWidth(null);
            int srcImgHeight = srcImg.getHeight(null);
            // 加水印
            BufferedImage bufImg = new BufferedImage(srcImgWidth,
                    srcImgHeight,
                    BufferedImage.TYPE_INT_RGB);
            //获取 Graphics2D 对象
            Graphics2D g = bufImg.createGraphics();
            //设置绘图区域
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            //设置字体
            Font font = new Font("宋体", Font.PLAIN, 20);
            // 根据图片的背景设置水印颜色
            g.setColor(Color.green);
            g.setFont(font);
            //获取文字长度
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format = sdf.format(new Date().getTime());
            int len = g.getFontMetrics(
                    g.getFont()).charsWidth(format.toCharArray(),
                    0,
                    format.length());
            int x = srcImgWidth - len - 10;
            int y = srcImgHeight - 20;
            g.drawString(format, x, y);
            g.dispose();
            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream("C:/Users/Administrator/Desktop/1/2.jpg");
            ImageIO.write(bufImg, "png", outImgStream);
            outImgStream.flush();
            outImgStream.close();
            System.out.println("添加水印完成");
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

经测试,能正常使用

实际项目中使用的是MultipartFile上传图片
在这里插入图片描述
我最开始想到的是一个笨方法,先上传到本地,处理好水印之后再上上传到ftp,后来发现可以只用上传一次处理

public MultipartFile addWorkMarkToMutipartFile(MultipartFile multipartFile) throws IOException {
    
    

        // 获取图片文件名 xxx.png xxx
        String originFileName = multipartFile.getOriginalFilename();
        // 获取原图片后缀 png
        int lastSplit = originFileName.lastIndexOf(".");
        String suffix = originFileName.substring(lastSplit + 1);
        // 获取图片原始信息
        String dOriginFileName = multipartFile.getOriginalFilename();
        String dContentType = multipartFile.getContentType();
        // 是图片且不是gif才加水印
        if (!suffix.equalsIgnoreCase("gif") && dContentType.contains("image")) {
    
    
            // 获取水印图片
            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);

            //调用画文字水印的方法
            markWord(bufImg, img);

            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;
    }

后面是上传图片逻辑,这里省略

测试
在这里插入图片描述
在这里插入图片描述
ftp服务器上的图片

猜你喜欢

转载自blog.csdn.net/weixin_45352783/article/details/121079466