侧边栏壁纸
博主头像
秋码记录

一个游离于山间之上的Java爱好者 | A Java lover living in the mountains

  • 累计撰写 133 篇文章
  • 累计创建 282 个标签
  • 累计创建 44 个分类

Springboot对上传图片添加水印后存储到阿里云OSS对象存储中

好些时候没发表文章了,由于最近有点忙,又更兼qiucode站点页面大改,新版页面也较旧版整洁多了!那具体该是如何实现呢?(言外之意无非就是程序怎么实现的),其实无非就是将MultipartFile对象进行二次处理(这里所说的处理就是在上传的原图的基础上添加水印),二次处理好了的图片远程存储到阿里云oss存储对象中。

好些时候没发表文章了,由于最近有点忙,又更兼qiucode站点页面大改,新版页面也较旧版整洁多了! 好了,废话少扯,切入正题,别把本文所讲的主题偏离了。先看下最终实现的效果图吧:

img

效果图也看了,那具体该是如何实现呢?(言外之意无非就是程序怎么实现的),其实无非就是将MultipartFile对象进行二次处理(这里所说的处理就是在上传的原图的基础上添加水印),二次处理好了的图片远程存储到阿里云oss存储对象中。 首先得先在pom.xml文件中引入阿里云OSS对象存储的SDK依赖jar,具体如下:

pom.xml文件添加阿里云OSS SDK依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>2.5.0</version>
</dependency>

OSSClientUtil工具类

/*由于篇幅有限,若实在需要OSSClientUtil类的话,可添加笔者QQ:2834491983 备注:qiucode.cn 图片添加水印
本文只贴出与本文相关的核心代码*/
public  String uploadImg2Oss(MultipartFile file) {
        if (file.getSize() > 1024 * 1024) {
            throw new ImgException("上传图片大小不能超过1M!");
        }
        String originalFilename = file.getOriginalFilename();
        String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
        Random random = new Random();
        String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
        try {
            InputStream inputStream = file.getInputStream();

            //2020-09-05 11:06 添加水印后再上传
            int lastSplit = originalFilename.lastIndexOf(".");
            String suffix = originalFilename.substring(lastSplit + 1);
            Image img = ImageIO.read(inputStream);
            // 加图片水印
            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);
            WordWaterMarker.markWord(bufImg, img, CommonConst.WATER_WORD, font ,size, Color.DARK_GRAY, imgWidth, imgHeight);
            ByteArrayOutputStream bs = new ByteArrayOutputStream();
            ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
            ImageIO.write(bufImg, suffix, imOut);
            InputStream is = new ByteArrayInputStream(bs.toByteArray());
            //添加水印  end

            //this.uploadFile2OSS(inputStream, name);
            this.uploadFile2OSS(is, name);
            return name;
        } catch (Exception e) {
            throw new ImgException("图片上传失败");
        }
    }

添加水印WaterMarker工具类

package cn.qiucode.blog.utils.watermarker;


import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @program: qiucode-blog
 * @description: 对图片进行处理  添加水印
 * @author: 上官江北
 * @create: 2020-09-05 14:16
 */
public class WordWaterMarker {

    /**
     * 加文字水印
     * @param bufImg --BufferedImage  用来画图的宽高跟需要加水印的图片一样的空白图
     * @param img --需要加水印的图片
     * @param text --水印文字
     * @param font --字体
     * @param size --字体大小
     * @param color --颜色
     * @param imgWidth --图片宽度
     * @param imgHeight --图片高度
     * @param  --水印相对于底片的x轴坐标(PS:左上角为(0,0))
     * @param  --水印相对于底片的y轴坐标(PS:左上角为(0,0))
     * @author 上官江北
     * @version 2019年01月29日 下午22:55:57
     */
    public static void markWord(BufferedImage bufImg, Image img, String text, Font font,int size, Color color, int imgWidth, int imgHeight) {
        //取到画笔
        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.setComposite (AlphaComposite.getInstance (AlphaComposite.SRC_ATOP, 0.190f));
        //位置
        //g.drawString(text, x, y);
        int x = -imgWidth / 2;
        int y = -imgHeight / 2;
        int markWidth = size * getLength(text);// 字体长度
        int markHeight = size;// 字体高度!
        // 设置水印旋转
        g.rotate (Math.toRadians (-40), (double) bufImg.getWidth () / 2, (double) bufImg.getHeight () / 2);
        // 循环添加水印
        while (x < imgWidth * 1.5) {
            y = -imgHeight / 2;
            while (y < imgHeight * 1.5) {
                //g.rotate(30 * Math.PI / 180);
                g.drawString (text, x, y);

                y += markHeight + 80;
            }
            x += markWidth + 80;
        }
        g.dispose();
    }

    /**
     * 获取字符长度,一个汉字作为 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;
    }
}

最后在Controller中调用就好了

@RequestMapping(value = "/upload", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> upload(HttpServletRequest request)
            throws IllegalStateException, IOException {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        Map<String ,Object> result=new HashMap<String ,Object>();

        // 判断 request 是否有文件上传,即多部分请求
        if (multipartResolver.isMultipart(request)) {
            // 转换成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            // 取得request中的所有文件名
            Iterator<String> iter = multiRequest.getFileNames();
            while (iter.hasNext()) {
                // 取得上传文件
                MultipartFile f = multiRequest.getFile(iter.next());
                if (f != null) {
                    String name=ossClientUtil.uploadImg2Oss(f);
                    String imgUrl = ossClientUtil.getImgUrl(name);
                    result.put("success",1);
                    result.put("message","上传成功");
                    result.put("url",imgUrl);
                }
            }
        }else{
            result.put("success",0);
            result.put("message","上传失败");
        }
        System.out.println(result.toString());
        return result;
    }

到这里,对上传图片进行二次处理(添加水印)后远程存储阿里云OSS对象存储中,就告一段落了,本文所贴出的代码均为核心实现的代码,若需完整代码,可在评论区留下您的联系方式,笔者好把本文相关的整理好打包发给您!

池塘中鱼的困惑
« 上一篇 2019-08-18
git使用教程之创建本地库并关联远程库(笔记整理篇一)
下一篇 » 2020-12-06

相关推荐