前言
最近某项目有个加水印的需求,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
代表图片AstorageService.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