java对整张图片添加水印(把水印铺满整张图片)

java对整张图片添加水印

  • 把水印铺满整张图片

参考代码

java 复制代码
 private final static Map<String,Object> imageConfig = getImgDefaultConfig();


    public static Map<String,Object> getImgDefaultConfig(){

        Map<String, Object> config = new HashMap<>();
        config.put("alpha",0.5f); // 水印透明度
        config.put("fontSize",28); // 水印文字大小
        config.put("font",new Font("微软雅黑", Font.PLAIN, 28)); // 水印文字字体
        config.put("color",Color.gray); // 水印文字颜色
        config.put("xMove",80); // 水印之间的间隔
        config.put("yMove",80); // 水印之间的间隔
        config.put("degree",-40);// 旋转角度
        config.put("formatName","JPG");
        return config;
    }




    /**
     * 获取文本长度。汉字为1:1,英文和数字为2:1
     */
    private static int getTextLength(String text) {
        int length = text.length();
        for (int i = 0; i < text.length(); i++) {
            String s = String.valueOf(text.charAt(i));
            if (s.getBytes().length > 1) {
                length++;
            }
        }
        length = length % 2 == 0 ? length / 2 : length / 2 + 1;
        return length;
    }

    /**
     * 给图片添加水印文字、可设置水印文字的旋转角度
     * @param logoText 水印文字
     * @param inputStream
     * @param outputStream
     */
    public static void imageByText(String logoText, InputStream inputStream, OutputStream outputStream, Map<String, Object> config) throws IOException {

        // 源图片
        Image srcImg = ImageIO.read(inputStream);

        // 原图宽度
        int width = srcImg.getWidth(null);

        // 原图高度
        int height = srcImg.getHeight(null);

        BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
        // 构建画笔对象
        Graphics2D g = buffImg.createGraphics();
        try {

            // 设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
            // 设置水印旋转
            Integer degree = (Integer) config.getOrDefault("degree", imageConfig.get("degree"));
            if (null != degree) {
                g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
            }
            // 设置水印文字颜色
            g.setColor((Color) config.getOrDefault("color", imageConfig.get("color")));
            // 设置水印文字Font
            g.setFont((Font) config.getOrDefault("font", imageConfig.get("font")));
            // 设置水印文字透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, (Float) config.getOrDefault("alpha", imageConfig.get("alpha"))));

            int x = -width / 2;
            int y;

            // 字体高度
            int markHeight = (int) config.getOrDefault("fontSize", imageConfig.get("fontSize"));

            // 字体长度
            int markWidth = markHeight * getTextLength(logoText);

            // 循环添加水印
            while (x < width * 1.5) {
                y = -height / 2;
                while (y < height * 1.5) {
                    g.drawString(logoText, x, y);
                    y += markHeight + (int) config.getOrDefault("yMove", imageConfig.get("yMove"));
                }
                x += markWidth + (int) config.getOrDefault("xMove", imageConfig.get("xMove"));
            }
        } finally {
            // 释放资源
            g.dispose();
        }

        // 生成图片
        ImageIO.write(buffImg, (String) config.getOrDefault("formatName", imageConfig.get("formatName")), outputStream);
    }

测试

java 复制代码
public static void main(String[] args) throws IOException {
        String logoText = "测试水印-abments";
        imageByText(logoText, new FileInputStream("F:\\tmp\\1\\test.jpg"), new FileOutputStream("F:\\tmp\\1\\test-水印.jpg"), new HashMap<>());

    }

效果展示

说明

方法imageByText的参数设置为InputStream inputStream, OutputStream outputStream,是为了方便java中直接输出给响应体对象。

在使用过程如果遇到问题欢迎留言讨论。

相关推荐
Biomamba生信基地1 分钟前
R语言基础| 回归分析
开发语言·回归·r语言
姓学名生5 分钟前
李沐vscode配置+github管理+FFmpeg视频搬运+百度API添加翻译字幕
vscode·python·深度学习·ffmpeg·github·视频
黑客-雨15 分钟前
从零开始:如何用Python训练一个AI模型(超详细教程)非常详细收藏我这一篇就够了!
开发语言·人工智能·python·大模型·ai产品经理·大模型学习·大模型入门
Pandaconda20 分钟前
【Golang 面试题】每日 3 题(三十九)
开发语言·经验分享·笔记·后端·面试·golang·go
是梦终空23 分钟前
JAVA毕业设计210—基于Java+Springboot+vue3的中国历史文化街区管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·历史文化街区管理·景区管理
加油,旭杏24 分钟前
【go语言】变量和常量
服务器·开发语言·golang
行路见知24 分钟前
3.3 Go 返回值详解
开发语言·golang
xcLeigh28 分钟前
WPF实战案例 | C# WPF实现大学选课系统
开发语言·c#·wpf
孤独且没人爱的纸鹤29 分钟前
【机器学习】深入无监督学习分裂型层次聚类的原理、算法结构与数学基础全方位解读,深度揭示其如何在数据空间中构建层次化聚类结构
人工智能·python·深度学习·机器学习·支持向量机·ai·聚类
l1x1n033 分钟前
No.35 笔记 | Python学习之旅:基础语法与实践作业总结
笔记·python·学习