JAVA 使用metadata-extractor添加水印

从代码中复制出来的,代码水印位置在左下角。
新手代码简陋,供查阅参考
在这里插入图片描述

<dependency>
      <groupId>com.drewnoakes</groupId>
      <artifactId>metadata-extractor</artifactId>
      <version>2.16.0</version>
  </dependency>
import lombok.Data;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * @author 
 * @date 2023/11/4 11:53
 */
@Data
public class WatermarkUtils {
    //左侧以及运算基数
    static int sizeFont = 30;
    //行间距
    static int lineSpacing = 10;
    //第一行是否缩进
    static boolean retract = false;
    //缩进大小
    static int ndentSize = 70;

    public static FileInputStream watermark(MultipartFile multipartFile,String[] waterMarkContent) throws Exception{
        Image srcImg = ImageIO.read(multipartFile.getInputStream());
        //获取图片的宽
        int srcImgWidth = srcImg.getWidth(null);
        //获取图片的高
        int srcImgHeight = srcImg.getHeight(null);

        System.out.println("图片的宽:" + srcImgWidth);
        System.out.println("图片的高:" + srcImgHeight);

        BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
        // 加水印
        //创建画笔
        Graphics2D g = bufImg.createGraphics();
        //srcImg 为上面获取到的原始图片的图片对象
        g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
        //-------------------------文字水印 start----------------------------
        //文字内容
        if (ObjectUtils.isEmpty(waterMarkContent)){
            waterMarkContent = new String[]{"时间无", "· 围栏地址无"};
        }
        //文字大小
        Integer[] sizes = {40, 30};

        //水印文字行数
        int rows = waterMarkContent.length;

        for (int i = 0; i < rows; i++) {
            //根据图片的背景设置水印颜色
            g.setColor(new Color(254, 255, 251, 250));
            //设置字体  画笔字体样式为微软雅黑,加粗,文字大小
            g.setFont(new Font("宋体", Font.BOLD, sizes[i]));
            //设置水印的坐标
            int x = sizeFont;
            if (0==i && retract){
                x += ndentSize;
            }
            int y = srcImgHeight - (rows - i) * sizes[i] - (lineSpacing * (rows - i));
//            System.out.println(i + "   坐标x:" + x + "  坐标y:" + y);

            //画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
            g.drawString(waterMarkContent[i], x, y);
        }
        //-------------------------文字水印 end----------------------------

        //-------------------------图片水印 start--------------------------
        // 水印文件
        Image srcWaterMark = ImageIO.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("static/20231104100744.png"));
        //获取水印图片的宽度
        int widthWaterMark = srcWaterMark.getWidth(null);
        //获取水印图片的高度
        int heightWaterMark = srcWaterMark.getHeight(null);
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));
        //绘制水印图片  坐标为中间位置
        double divisor = (double)widthWaterMark / (double)srcImgWidth;
        int y = srcImgHeight - (rows) * sizes[0] - (lineSpacing * (rows)) - sizes[0] - (int)(heightWaterMark*divisor);
        int x = sizeFont;
//        System.out.println("   坐标x:" + x + "  坐标y:" + y);
        g.drawImage(srcWaterMark, x, y, (int)(widthWaterMark*divisor), (int)(heightWaterMark*divisor), null);

        //-------------------------图片水印 end--------------------------
        // 水印文件结束
        g.dispose();
        //待存储的地址
        String originalFilename = multipartFile.getOriginalFilename();
        int i = originalFilename.lastIndexOf(".");
        File tarImgPath = File.createTempFile(originalFilename.substring(0,i),originalFilename.substring(i));
        // 输出图片
        FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
		//jpg 图片小,其他格式图片大
        ImageIO.write(bufImg, "jpg", outImgStream);
//        System.out.println("添加水印完成");
        outImgStream.flush();
        outImgStream.close();

        try {
            return new FileInputStream(tarImgPath);
        } catch (Exception e) {
            throw new IOException("Failed to convert FileOutputStream to MultipartFile", e);
        } finally {
            // 删除临时文件
            if (!tarImgPath.delete()) {
                System.err.println("Failed to delete temporary file: " + tarImgPath.getAbsolutePath());
            }
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值