发表于: 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();
}
明天计划的事:部署到服务器
遇到的困难:
收获:
评论