给图片添加水印

  • 2023-12-09 05:17:09
  • 阅读:52次
@Slf4j
public class ImageUtils {
    @Test
    public void test1() throws IOException {
        //得到全部的图片文件
        Path path = Paths.get("D:\\Files\\CDN\\file\\_resources");
        if (!Files.exists(path)) {
            throw new RuntimeException("目录或文件不存在!");
        }
        List<Path> collect = new ArrayList<>();
        if (Files.isDirectory(path)) {
            collect = Files.walk(path).filter(temp -> temp.getFileName().toString().endsWith(".png")).collect(Collectors.toList());
        } else {
            boolean b = path.getFileName().toString().endsWith(".png");
            if (b) {
                collect.add(path);
            }
        }
        if (CollectionUtils.isEmpty(collect)) {
            return;
        }
        for (Path temp : collect) {
            changeImg(temp.toFile());
        }
    }

    /**
     * 加水印
     *
     * @param srcImgFile 本地图片地址
     * @throws IOException
     */
    private void changeImg(File srcImgFile) throws IOException {
        //将文件对象转化为图片对象
        Image srcImg = ImageIO.read(srcImgFile);
        //获取图片的宽
        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();
        //绘制原始图片
        g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
        //-------------------------文字水印 start----------------------------
        //根据图片的背景设置水印颜色
        g.setColor(new Color(158,160,161));
        //设置字体  画笔字体样式为微软雅黑,加粗,文字大小为12pt
        g.setFont(new Font("微软雅黑", Font.BOLD, 12));
        //水印内容
        String waterMarkContent = "https://www.cnblogs.com/lemonpuer";
        //设置水印的坐标
        int x = (srcImgWidth - getWatermarkLength(waterMarkContent, g)) - 5;
        int y = srcImgHeight - 5;
        //画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
        g.drawString(waterMarkContent, x, y);
        g.dispose();
        //-------------------------文字水印 end----------------------------
        //待存储的地址
//        String tarImgPath = "F:\\0a8de9fc675db86eab79aa36b7575374.png";
        // 输出图片
        FileOutputStream outImgStream = new FileOutputStream(srcImgFile);
        ImageIO.write(bufImg, "png", outImgStream);
        log.info("图片{}成功添加水印",srcImgFile.getName());
        outImgStream.flush();
        outImgStream.close();
    }

    /**
     * 获取水印文字的长度
     *
     * @param waterMarkContent
     * @param g
     * @return
     */
    private int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }
}

热门内容