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
在这里插入图片描述

Spring Boot是一个基于Java的框架,用于开发微服务应用程序。FFmpeg是一个强大的音视频处理工具,而JavaCV是一个在Java平台上使用OpenCV和FFmpeg功能。 请问您是想要实现在使用Spring Boot后端中使用FFmpeg和JavaCV给音视频文件水印,并将处理后的文件推吗? 如果是这样,首先需要在您的Spring Boot项目中引入JavaCV的依赖,例如: ``` <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.4</version> </dependency> ``` 然后,您可以使用JavaCV提供的FFmpegFrameGrabber和FFmpegFrameRecorder类来分别处理输入和输出的音视频。您可以使用FFmpegFrameGrabber类来读取原始的音视频文件,然后使用FFmpegFrameRecorder类来创建一个新的音视频,并在其上水印水印的具体步骤大致如下: 1. 创建一个FFmpegFrameGrabber对象,用于读取原始音视频文件。 2. 创建一个FFmpegFrameRecorder对象,用于输出水印后的音视频。 3. 使用FFmpegFrameGrabber对象的grab方法读取每一帧的音视频数据,并使用FFmpegFrameRecorder对象的record方法写入水印后的音视频。 4. 在每一帧的音视频数据上添水印,可以使用JavaCV提供的图像处理功能实现,例如在视频帧上添图片或者文字水印。 5. 循环执行第3和第4步,直至处理完所有的音视频帧。 6. 完成水印后的音视频处理后,执行FFmpegFrameRecorder对象的stop方法,结束音视频的处理。 7. 将处理后的音视频到指定的服务器或平台。 需要注意的是,水印的效果和位置需要根据实际需求进行调整,并且推需要配置相应的推地址和参数。 总结起来,使用Spring Boot结合FFmpeg和JavaCV可以完成后端水印并推的任务。具体的实现步骤可以按上述指引进行操作。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值