栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java实现给MultipartFile添加水印

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 {
    
    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服务器上的图片

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390220.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号