SpringBoot thumbnailator 图片处理

1、序

在实际项目中,有时为了响应速度,难免会对一些高清图片进行一些处理,比如图片压缩之类的,而其中压缩可能就是最为常见的。使用 Thumbnailator 库。
Thumbnailator 是一个优秀的图片处理的 Google 开源 Java 类库,专门用来生成图像缩略图的,通过很简单的 API 调用即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图。两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。可毫不夸张的说,它是一个处理图片十分棒的开源框架。
支持:图片缩放,区域裁剪,水印,旋转,保持比例。
Thumbnailator 官网:https://code.google.com/p/thumbnailator/

2、代码示例

2.1. 新建一个springboot项目

2.2. 引入依赖 thumbnailator

  1. <dependency>
  2. <groupId>net.coobird</groupId>
  3. <artifactId>thumbnailator</artifactId>
  4. <version>0.4.8</version>
  5. </dependency>

2.3. controller

主要实现了如下几个接口作为测试:

  1. @RestController
  2. public class ThumbnailsController {
  3. @Resource
  4. private IThumbnailsService thumbnailsService;
  5. /**
  6. * 指定大小缩放
  7. * @param resource
  8. * @param width
  9. * @param height
  10. * @return
  11. */
  12. @GetMapping("/changeSize")
  13. public String changeSize(MultipartFile resource, int width, int height) {
  14. return thumbnailsService.changeSize(resource, width, height);
  15. }
  16. /**
  17. * 指定比例缩放
  18. * @param resource
  19. * @param scale
  20. * @return
  21. */
  22. @GetMapping("/changeScale")
  23. public String changeScale(MultipartFile resource, double scale) {
  24. return thumbnailsService.changeScale(resource, scale);
  25. }
  26. /**
  27. * 添加水印 watermark(位置,水印,透明度)
  28. * @param resource
  29. * @param p
  30. * @param shuiyin
  31. * @param opacity
  32. * @return
  33. */
  34. @GetMapping("/watermark")
  35. public String watermark(MultipartFile resource, Positions p, MultipartFile shuiyin, float opacity) {
  36. return thumbnailsService.watermark(resource, Positions.CENTER, shuiyin, opacity);
  37. }
  38. /**
  39. * 图片旋转 rotate(度数),顺时针旋转
  40. * @param resource
  41. * @param rotate
  42. * @return
  43. */
  44. @GetMapping("/rotate")
  45. public String rotate(MultipartFile resource, double rotate) {
  46. return thumbnailsService.rotate(resource, rotate);
  47. }
  48. /**
  49. * 图片裁剪
  50. * @param resource
  51. * @param p
  52. * @param width
  53. * @param height
  54. * @return
  55. */
  56. @GetMapping("/region")
  57. public String region(MultipartFile resource, Positions p, int width, int height) {
  58. return thumbnailsService.region(resource, Positions.CENTER, width, height);
  59. }
  60. }

3、功能实现

其实引入了这个 Thumbnailator 类库后,代码其实很少,只需要按照规则调用其 API 来实现即可。

3.1 指定大小缩放

  1. /**
  2. * 指定大小缩放 若图片横比width小,高比height小,放大
  3. * 若图片横比width小,高比height大,高缩小到height,图片比例不变
  4. * 若图片横比width大,高比height小,横缩小到width,图片比例不变
  5. * 若图片横比width大,高比height大,图片按比例缩小,横为width或高为height
  6. *
  7. * @param resource 源文件路径
  8. * @param width 宽
  9. * @param height 高
  10. * @param tofile 生成文件路径
  11. */
  12. public static void changeSize(String resource, int width, int height, String tofile) {
  13. try {
  14. Thumbnails.of(resource).size(width, height).toFile(tofile);
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }

3.2 指定比例缩放

  1. /**
  2. * 指定比例缩放 scale(),参数小于1,缩小;大于1,放大
  3. *
  4. * @param resource 源文件路径
  5. * @param scale 指定比例
  6. * @param tofile 生成文件路径
  7. */
  8. public static void changeScale(String resource, double scale, String tofile) {
  9. try {
  10. Thumbnails.of(resource).scale(scale).toFile(tofile);
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. }

3.3 添加水印

  1. /**
  2. * 添加水印 watermark(位置,水印,透明度)
  3. *
  4. * @param resource 源文件路径
  5. * @param p 水印位置
  6. * @param shuiyin 水印文件路径
  7. * @param opacity 水印透明度
  8. * @param tofile 生成文件路径
  9. */
  10. public static void watermark(String resource, Positions p, String shuiyin, float opacity, String tofile) {
  11. try {
  12. Thumbnails.of(resource).scale(1).watermark(p, ImageIO.read(new File(shuiyin)), opacity).toFile(tofile);
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }

3.4 图片旋转

  1. /**
  2. * 图片旋转 rotate(度数),顺时针旋转
  3. *
  4. * @param resource 源文件路径
  5. * @param rotate 旋转度数
  6. * @param tofile 生成文件路径
  7. */
  8. public static void rotate(String resource, double rotate, String tofile) {
  9. try {
  10. Thumbnails.of(resource).scale(1).rotate(rotate).toFile(tofile);
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. }

3.5 图片裁剪

  1. /**
  2. * 图片裁剪 sourceRegion()有多种构造方法,示例使用的是sourceRegion(裁剪位置,宽,高)
  3. *
  4. * @param resource 源文件路径
  5. * @param p 裁剪位置
  6. * @param width 裁剪区域宽
  7. * @param height 裁剪区域高
  8. * @param tofile 生成文件路径
  9. */
  10. public static void region(String resource, Positions p, int width, int height, String tofile) {
  11. try {
  12. Thumbnails.of(resource).scale(1).sourceRegion(p, width, height).toFile(tofile);
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }

说明:

  • 1.keepAspectRatio(boolean arg0) 图片是否按比例缩放(宽高比保持不变)默认 true
  • 2.outputQuality(float arg0) 图片质量
  • 3.outputFormat(String arg0) 格式转换

    注意

    :::danger 值得注意的是,若 png、gif 格式图片中含有透明背景,使用该工具压缩处理后背景会变成黑色,这是 Thumbnailator 的一个 bug,预计后期版本会解决。 :::