SpingBoot/JAVA实现给图片加水印功能(通过thumbnailator库)

前言

最近某项目有个加水印的需求,JAVA实现给已上传的图片增加水印并输出的功能,图片A+水印B=合成带水印缓存图片C(就是不需要保存到硬盘,不占用空间),目前网上的解决方案挺多但是挺乱,于是趁机整理了一份简洁版供大家使用。这里借助了一个很强大的Thumbnails库

图片A
在这里插入图片描述

水印B
在这里插入图片描述
效果图C
在这里插入图片描述
MAVEN

<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<!-- https://github.com/coobird/thumbnailator -->
<dependency>
	<groupId>net.coobird</groupId>
	<artifactId>thumbnailator</artifactId>
	<version>0.4.13</version>
</dependency>

核心代码

  • storageService.getPathString()仅用于获取存放图片的目录。
  • storageService.getPathString()+filename代表图片A
  • storageService.getPathString()+"watermark.png"代表水印B `BufferedImage
  • ` 为缓存的图片类,也就是我不需要save到file中去,这里就借助这个对象,如果你需要保存,可以使用toFile();
	/**
	 * JAVA给图片加水印
	 * @author zhengkai.blog.csdn.net
	 * @param filename
	 * @param response
	 * @throws IOException
	 */
	@GetMapping("/files2/{filename:.+}")
	@ResponseBody
	@Async
	public void serveFile2(@PathVariable String filename, HttpServletResponse response) throws IOException {
		//加载要显示的文件
		File inFile = new File(storageService.getPathString()+filename);
		//加载水印文件
		File watFile = new File(storageService.getPathString()+"watermark.png");
		//加载到BufferedImage中
		BufferedImage originalImage = ImageIO.read(inFile);
		BufferedImage waterImage = ImageIO.read(watFile);
		//调用Thumbnails库可参考(https://github.com/coobird/thumbnailator/wiki/Examples)
		//by zhengkai.blog.csdn.net
		BufferedImage thumbnail = Thumbnails.of(originalImage)
				//必须设置大小,否则有size not set的ERROR
				.size(600, 400)
				//var3表示透明度
				.watermark(Positions.BOTTOM_RIGHT, waterImage,0.2f)
				//缓存输出
				.asBufferedImage();
		//从HttpServletResponse中获取输出流
		OutputStream outputStream = response.getOutputStream();
		//将BufferedImage转换为InputStream
		InputStream inputStream = bufferedImageToInputStream(thumbnail);
		//直接COPY输出
		IOUtils.copy(inputStream, outputStream);
		//清理缓存
		IOUtils.closeQuietly(inputStream);
		IOUtils.closeQuietly(outputStream);
		//输出下载格式的图片
		/*return  ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION,
				"attachment; filename=\"" + URLEncoder.encode(filename, "UTF-8") + "\"").body(thumbnail);*/
	}
	/**
	 * JAVA给图片加水印:将BufferedImage转换为InputStream
	 * @author zhengkai.blog.csdn.net
	 */
	public InputStream bufferedImageToInputStream(BufferedImage image){
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		try {
			ImageIO.write(image, "png", os);
			InputStream input = new ByteArrayInputStream(os.toByteArray());
			return input;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

效果展示

Mission Compled! resolved by zhengkai.blog.csdn.net
在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页