SpingBoot/JAVA實現給圖片加水印功能(通過thumbnailator庫)

Moshow鄭鍇發表於2020-12-29

前言

最近某專案有個加水印的需求,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
在這裡插入圖片描述

相關文章