在 Java Spring Boot 中实现图片压缩,通常使用一些常见的图像处理库,如 ImageIO、Thumbnailator 或 Apache Commons Imaging。在 Spring Boot 项目中,我们可以结合这些库来处理图片压缩的需求。下面我将介绍如何通过 Thumbnailator 来实现图片压缩,因其 API 简单,功能强大,适合大多数应用场景。
1. 添加依赖
首先,您需要在项目的 pom.xml 文件中添加 Thumbnailator 依赖。如果你使用的是 Maven 构建工具,可以将以下依赖添加到 dependencies 部分:
<dependencies>
<!-- Thumbnailator dependency for image compression -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.14</version>
</dependency>
</dependencies>
2. 图片压缩功能实现
然后,创建一个服务类,用来处理图片压缩。
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.IOException;
@Service
public class ImageCompressionService {
// 压缩图片并保存为新文件
public void compressImage(String inputImagePath, String outputImagePath, int width, int height) throws IOException {
Thumbnails.of(inputImagePath)
.size(width, height) // 设置压缩后的宽高
.outputFormat("jpg") // 设置输出格式(可以选择其他格式如 png)
.toFile(outputImagePath); // 输出文件路径
}
// 压缩图片并返回压缩后的字节流
public byte[] compressImageToBytes(String inputImagePath, int width, int height) throws IOException {
return Thumbnails.of(inputImagePath)
.size(width, height) // 设置压缩后的宽高
.outputFormat("jpg") // 设置输出格式
.asBufferedImage() // 转换为 BufferedImage
.toString() // 进一步操作(如转换为字节数组)
.getBytes(); // 返回字节数组
}
}
3. 使用该服务类
控制器中使用该服务类来压缩图片。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
@RestController
@RequestMapping("/image")
public class ImageController {
@Autowired
private ImageCompressionService imageCompressionService;
// 通过文件路径压缩图片
@PostMapping("/compress")
public String compressImage(@RequestParam String inputImagePath,
@RequestParam String outputImagePath,
@RequestParam int width,
@RequestParam int height) {
try {
imageCompressionService.compressImage(inputImagePath, outputImagePath, width, height);
return "Image compressed successfully!";
} catch (IOException e) {
e.printStackTrace();
return "Failed to compress image: " + e.getMessage();
}
}
// 通过上传的图片文件压缩并返回字节数组
@PostMapping("/compress-file")
public byte[] compressImageFile(@RequestParam("file") MultipartFile file,
@RequestParam int width,
@RequestParam int height) throws IOException {
File tempFile = File.createTempFile("temp", ".tmp");
file.transferTo(tempFile);
return imageCompressionService.compressImageToBytes(tempFile.getAbsolutePath(), width, height);
}
}
4. 配置上传文件的大小限制(可选)
可能需要配置最大文件上传限制。在 application.properties 或 application.yml 中可以设置文件大小限制
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
5. 完成
在上述代码中,compressImage 方法会接受图片路径、压缩后的宽高以及输出路径,将图片压缩并保存到指定的文件中。如果您需要通过 HTTP 请求上传图片并进行压缩,可以使用 /compress-file 接口,该接口将文件上传并压缩后返回字节数组。
注意事项:
- 图片质量控制:如果希望压缩过程中保持一定的图片质量,Thumbnailator 还支持设置图像质量
Thumbnails.of(inputImagePath)
.size(width, height)
.outputQuality(0.8) // 设置质量,范围为0.0到1.0,越接近1质量越高
.toFile(outputImagePath);
- 图片格式:可以根据需要选择压缩后的图片格式(如 PNG, JPG, JPEG 等)
- 性能问题:压缩图片时,如果图片尺寸较大或者需要处理的图片很多,可以考虑异步处理,避免阻塞主线程。