java给图片加上图片水印水印

  public String uploadFile3(@RequestParam(value = "file",required=false) MultipartFile file,
                              HttpServletRequest request) throws IOException {


                             
        JSONObject json = null;
        OutputStream os = null;
        String filePath = "";

        Map<String,String> map = new HashMap<String,String>();
//MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法
//会调用 MultipartResolver 的 isMultipart() 方法判断请求中是否包含文件。如果请求数据中包含文件,
//则调用 MultipartResolver 的 resolveMultipart() 方法对请求的数据进行解析,
//然后将文件数据解析成 MultipartFile 并封装在 MultipartHttpServletRequest (继承了 HttpServletRequest) 对象中,最后传递给 Controller
        CommonsMultipartResolver cmr = new CommonsMultipartResolver(request.getServletContext());
        if (cmr.isMultipart(request)) {
            MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) (request);
            //从MultipartHttpServletRequest 中获取文件
            //Iterator  是一个迭代器
            Iterator<String> files = mRequest.getFileNames();
            String imagePath = "";
            //hasNext()方法检查是否还有元素
            while (files.hasNext()) {
            //next()获得序列中的下一个元素
                MultipartFile mf = mRequest.getFile(files.next());
                if (mf != null) {
                    try {
                    //得到上传的文件的输入流
                    //可以直接使用MultipartFile file 参数获取需要上传的文件,直接使用file 获得输入流
                        InputStream inputimg=mf.getInputStream();
                        //使用image对象对输入流进行读取
                        Image img= ImageIO.read(inputimg);
                        //Image是一个抽象类,BufferedImage是其实现类,是一个带缓冲区图像类,
                        //主要作用是将一幅图片加载到内存中(BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便地操作这个图片),
                        //提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常用来做图片大小变换、图片变灰、设置透明不透明等。
                        BufferedImage buffImg = new BufferedImage(img.getWidth(null), img.getHeight(null),BufferedImage.TYPE_INT_RGB);
                        //得到画笔对象
                        Graphics2D g = buffImg.createGraphics();
                        //抗锯齿
                        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                        //绘制图像的方法
                        g.drawImage(img,0,0,buffImg.getWidth(),buffImg.getHeight(),null);
                            // 设置水印旋转
                        g.rotate(Math.toRadians(45), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
                        //作为水印图片路径
                        String syImagePath = this.getClass().getClassLoader().getResource("sy.png").getPath();
                        System.out.println(syImagePath);
                        //作为水印的图标
                        ImageIcon imgIcon = new ImageIcon(syImagePath);
                        //image对象
                        Image imgs = imgIcon.getImage();
                        float alpha = 0.5f; // 透明度
                        
                        // composite 用于所有绘制方法中,如 drawimage、drawstring、draw 和 fill。 
                        //它指定新的像素如何在呈现过程中与图形设备上的现有像素组合。
                        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
                        // 表示水印图片的位置
                        int height = imgIcon.getIconHeight();
                        int Witdh =imgIcon.getIconWidth();
                        int x=0;
                        int y=0;
                        for (int i=0;i<6;i++){
                        //一张图片只画一个水印的话不需要使用循环直接将作为水印的对象在原有画布上在绘制
                            g.drawImage(imgs, x, y, null);
                            x=x+height;
                            y=y+Witdh/3;
                        }
                        // composite 用于所有绘制方法中,如 drawimage、drawstring、draw 和 fill。 
                        //它指定新的像素如何在呈现过程中与图形设备上的现有像素组合。
                        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
                        //释放资源
                        g.dispose();
                        // 文件保存路径
                         filePath = request.getSession().getServletContext().getRealPath("/")+"\\"
                                + QiniuUtil.renamePic(mf.getOriginalFilename());
                         //这里使用了一个输出流写入到硬盘因为transferTo()多次尝试无法生效
                         os = new FileOutputStream(filePath);
                        ImageIO.write(buffImg, "JPG", os);
                        //保存
                        //File file3=new File((filePath));
                        //mf.transferTo(file3);
                        //上传七牛云服务器
                        imagePath= QiniuUtil.qiniuUpload(filePath);
                        if(imagePath.contains("error")){
                            throw new Exception("上传失败");
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }finally {
                       try {
                       //注意一定要在调用删除文件的delete()方法前关闭流否则上传到图片服务器后无法删除写到硬盘上的文件
                            if (null != os)
                                os.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    File file1=new File(filePath);
                    //下面的删除一定要在流关闭之后才能正常执行
                    // 路径为文件且不为空则进行删除
                    if (file1.isFile() && file1.exists()) {
                        file1.delete();
                    }
                    //下面是拼接返回前端的文件名和路径
                    String contentType=mf.getContentType();
                    String suffixName=contentType.substring(contentType.indexOf("/")+1);
                    String newFileName = UUID.randomUUID()+"."+suffixName;
                    // 返回给前端的参数
                    map.put("filename", newFileName);
                    map.put("filepath", imagePath);
                    json = JSONObject.fromObject(map);
                }
            }
        }
        return json.toString();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值