发表于: 2020-07-23 23:04:46

1 1364


今天完成的事:

关于实现图片的加水印

网上有很多工具类,拿过来就可以用了,下面贴上代码


public class ImageMarkLogoByIcon {

/**
    * 给图片添加水印
    * @param iconPath 水印图片路径
    * @param srcImgPath 源图片路径
    * @param targerPath 目标图片路径
    */
   public static void markImageByIcon(String iconPath, String srcImgPath,
                                      String targerPath) {
markImageByIcon(iconPath, srcImgPath, targerPath, null);
   }

/**
    * 给图片添加水印、可设置水印图片旋转角度
    * @param iconPath 水印图片路径
    * @param srcImgPath 源图片路径
    * @param targerPath 目标图片路径
    * @param degree 水印图片旋转角度
    */
   public static void markImageByIcon(String iconPath, String srcImgPath,
                                      String targerPath, Integer degree) {

OutputStream os = null;
       try {
Image srcImg = ImageIO.read(new File(srcImgPath));


           BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
                   srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

           // 得到画笔对象
           // Graphics g= buffImg.getGraphics();
           Graphics2D g = buffImg.createGraphics();

           // 设置对线段的锯齿状边缘处理
           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);

           if (null != degree) {

g.rotate(Math.toRadians(degree),
                       (double) buffImg.getWidth() / 2,
                       (double) buffImg.getHeight() / 2);

               // 设置水印旋转
               g.rotate(Math.toRadians(degree),
                       (double) buffImg.getWidth() / 2, (double) buffImg
                               .getHeight() / 2);
           }

// 水印图象的路径 水印一般为gif或者png的,这样可设置透明度
           ImageIcon imgIcon = new ImageIcon(iconPath);

           // 得到Image对象。
           Image img = imgIcon.getImage();

//            int watermarkImageWidth=img.getWidth(null);
//            int watermarkImageHeight=img.getHeight(null);
//            double dmarkWidth = width*0.4;// 设置水印的宽度为图片宽度的0.4
//            double dmarkHeight = dmarkWidth * ((double)watermarkImageHeight/(double)watermarkImageWidth);//强转为double计算宽高比例
//            int imarkWidth = (int) dmarkWidth;


           float alpha = 0.5f; // 透明度
           g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                   alpha));

           // 表示水印图片的位置
           g.drawImage(img, 150, 300, null);

           g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

           g.dispose();

           os = new FileOutputStream(targerPath);

           // 生成图片
           ImageIO.write(buffImg, "JPG", os);

           System.out.println("图片完成添加Icon印章。。。。。。");
       } catch (Exception e) {
e.printStackTrace();
       } finally {
try {
if (null != os)
os.close();
           } catch (Exception e) {
e.printStackTrace();
           }
}
}

/**
    * @param args
    */

   /**
    * 给图片添加水印、可设置水印图片旋转角度
    * @iconPath 水印图片路径
    * @srcImgPath 源图片路径
    * @targerPath 加水印后的目标图片路径
    * @degree 水印图片旋转角度
    *
    */
   @Test
   public static void main(String[] args) {
String srcImgPath = "D:\\IDEA_Projects\\JAVA\\xzy-task7\\src\\main\\webapp\\WEB-INF\\image\\明星1.jpg";
       String iconPath = "D:\\IDEA_Projects\\JAVA\\xzy-task7\\src\\main\\webapp\\WEB-INF\\image\\aa.jpg";
       String targerPath = "D:\\IDEA_Projects\\JAVA\\xzy-task7\\src\\main\\webapp\\WEB-INF\\image\\水印.jpg";
       String targerPath2 = "D:\\IDEA_Projects\\JAVA\\xzy-task7\\src\\main\\webapp\\WEB-INF\\image\\水印1.jpg";
       // 给图片添加水印
       ImageMarkLogoByIcon.markImageByIcon(iconPath, srcImgPath, targerPath);
       // 给图片添加水印,水印旋转-45
       ImageMarkLogoByIcon.markImageByIcon(iconPath, srcImgPath, targerPath2,
               -45);

   }


}


执行成功

查看效果图



完成之前的上传图片并将图片的云链接存储到服务器中

贴上代码

@RequestMapping(value = "/upimage", method = RequestMethod.POST)
public String image(MultipartFile file, HttpSession session, HttpServletRequest httpServletRequest) {

String fileName = file.getOriginalFilename();
   logger.info(fileName);

   String picture = session.getServletContext().getRealPath("/upimage") + File.separator + fileName;
   logger.info("图片路径=====" + picture);

   String url = null;
   try {
url = upimageUtil.upload(fileName, file);
       logger.info("图片上传成功======");
   } catch (FileNotFoundException e) {

logger.info("图片上传失败,打印堆栈信息" + e);
   }

//获取cookies
   Cookie[] cookies = httpServletRequest.getCookies();

   if (cookies != null) {
//System.out.println("开始遍历");
       //System.out.println(cookies);
       // 遍历
       for (Cookie cookie : cookies) {
if (cookie.getName().equals("token")) {
String tokenDES = cookie.getValue();
               String token = DESUtil.getDecryptString(tokenDES);//解密
               logger.info("=====token的解密value:" + token);

               // 分割字符串 获取id
              Integer id = Integer.valueOf(token.split("=")[0]);

              User user = new User();

              user.setId(id);
              user.setPicture(url);


             int a = userService.updatebyId(user);
             if(a!=0){
logger.info("成功");
             }else {
logger.info("失败");
             }

}
}

}
return "redirect:/user/allBmb";
}


这里我用到了之前任务六中的缓存和cookie,所以登录后可以从cookie中获取到当前用户的id,然后写一个实体类和接口,

//更新头像
Integer updatebyId(User user);

来对当前用户进行一次图片的更新

<update id="updatebyId" parameterType="User">
   update user set picture = #{picture} where id = #{id}
</update>


启动tomcat,上传图片

运行成功


查看数据库


复制链接到浏览器查看是否能访问

ok




关于防盗链

阿里云有相关的接口,只需写一个工具类即可

为了防止您在OSS上的数据被其他人盗链而产生额外费用,您可以设置防盗链功能,包括以下参数:

Referer白名单。仅允许指定的域名访问OSS资源。

是否允许空Referer。如果不允许空Referer,则只有HTTP或HTTPS header中包含Referer字段的请求才能访问OSS资源。


// Endpoint以杭州为例,其它Region请按实际情况填写。
       String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
       String accessKeyId = "<yourAccessKeyId>";
       String accessKeySecret = "<yourAccessKeySecret>";
       String bucketName = "<yourBucketName>";

// 创建OSSClient实例。
       OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

       List<String> refererList = new ArrayList<String>();
// 添加Referer白名单。Referer参数支持通配符星号(*)和问号(?)。
              refererList.add("http://www.aliyun.com");
       refererList.add("http://www.*.com");
       refererList.add("http://www.?.aliyuncs.com");
// 设置存储空间Referer列表。设为true表示Referer字段允许为空。
       BucketReferer br = new BucketReferer(true, refererList);
       ossClient.setBucketReferer(bucketName, br);

// 关闭OSSClient
       ossClient.shutdown();

   }



明天计划的事:部署到服务器

遇到的困难:

收获:




返回列表 返回列表
评论

    分享到