前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java上传图片同时后台直接给MultipartFile对象添加文字水印

Java上传图片同时后台直接给MultipartFile对象添加文字水印

作者头像
游离于山间之上的Java爱好者
发布2022-08-09 14:59:28
1.3K0
发布2022-08-09 14:59:28
举报
文章被收录于专栏:你我杂志刊

现在基本上都是使用Spring、SpringMVC开发JavaWeb项目了,所以这里笔者就以SpringMVC上传为例进行示范。 首先,用你最熟悉的IDE工具(Eclipse、IDEA等)打开你的JavaWeb工程,新建一个util工具类。

代码语言:javascript
复制
/**
     * 加文字水印
     * @param bufImg --BufferedImage  用来画图的宽高跟需要加水印的图片一样的空白图
     * @param img --需要加水印的图片
     * @param text --水印文字
     * @param font --字体
     * @param color --颜色
     * @param x  --水印相对于底片的x轴坐标(PS:左上角为(0,0))
     * @param y  --水印相对于底片的y轴坐标(PS:左上角为(0,0))
     * @author 上官江北
     * @version 2019年01月29日 下午22:55:57
     */
    public static void markWord(BufferedImage bufImg, Image img, String text, Font font, Color color, int x, int y) {
        //取到画笔
        Graphics2D g = bufImg.createGraphics();
        //画底片
        g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);
        g.setColor(color);
        g.setBackground(Color.BLACK);
        g.setFont(font);
        //位置
        g.drawString(text, x, y);
        g.dispose();
    

以及对添加水印的文字进行处理

代码语言:javascript
复制
 /**
     * 获取字符长度,一个汉字作为 1 个字符, 一个英文字母作为 0.5 个字符
     * @param text
     * @return 字符长度,如:text="中国",返回 2;text="test",返回 2;text="中国ABC",返回 4.
     */
    public static int getLength(String text) {
        int textLength = text.length();
        int length = textLength;
        for (int i = 0; i < textLength; i++) {
            if (String.valueOf(text.charAt(i)).getBytes().length > 1) {
                length++;
            }
        }
        return (length % 2 == 0) ? length / 2 : length / 2 + 1;
    }

最后对MultipartFile对象做处理,也就是添加文字水印,再返回已添加好的MultipartFile对象给Controller层,这样上传到服务器端就是有带文字水印的图片了

代码语言:javascript
复制
/**
     * 直接给multipartFile加上文字水印再进行保存图片的操作方便省事
     *
     * @param multipartFile 文件上传的对象
     * @param  word  水印文字
     * @return  返回添加后的MultipartFile对象
     * @throws IOException
     * @author 上官江北
     * @version 2019年01月29日 下午22:55:57
     */
    public static MultipartFile addWorkMarkToMutipartFile(MultipartFile multipartFile,
                                                          String word) 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);
            //设置字体
            int size=bufImg.getWidth()/16;
            Font font = new Font("宋体", Font.PLAIN, size);
            //调用画文字水印的方法
            int x=(imgWidth - (getLength(word) * bufImg.getWidth()/16)) / 2 + 10;
            int y=(imgHeight - bufImg.getWidth()/16) / 2 + 10;
            markWord(bufImg, img, word, font , Color.GREEN, x, y);
            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;
    }

上传前原图:

经过后台添加水印处理后图片:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 你我杂志刊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多媒体处理
多媒体处理(Multimedia Processing,MMP)是数据万象推出的音视频处理服务,集成音视频转码、极速高清、精彩集锦、超分辨率、数字水印等能力,满足传媒、文旅、电商等各行业多媒体处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档