在 Spring Boot 应用中,可以使用 Java 的图像处理库(如 java.awt 和 javax.imageio)来实现图片水印和裁剪功能。以下是一个示例,展示如何实现这些功能。
1. 添加依赖确保你的 pom.xml 中包含以下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>2. 创建图片处理服务
创建一个服务类,用于处理图片的水印和裁剪功能。
import org.springframework.stereotype.Service; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; @Service public class ImageService { public BufferedImage addWatermark(BufferedImage sourceImage, String watermarkText) { Graphics2D g2d = (Graphics2D) sourceImage.getGraphics(); // 设置水印字体和颜色 Font font = new Font("Arial", Font.BOLD, 30); g2d.setFont(font); g2d.setColor(new Color(255, 0, 0, 80)); // 红色,透明度80 // 计算水印位置 FontMetrics fontMetrics = g2d.getFontMetrics(); int x = sourceImage.getWidth() - fontMetrics.stringWidth(watermarkText) - 10; int y = sourceImage.getHeight() - fontMetrics.getHeight() + 30; // 添加水印 g2d.drawString(watermarkText, x, y); g2d.dispose(); return sourceImage; } public BufferedImage cropImage(BufferedImage sourceImage, int x, int y, int width, int height) { return sourceImage.getSubimage(x, y, width, height); } public void saveImage(BufferedImage image, String formatName, File output) throws IOException { ImageIO.write(image, formatName, output); } }3. 创建控制器
创建一个控制器,提供 API 接口来处理图片的水印和裁剪请求。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; @RestController @RequestMapping("/api/images") public class ImageController { @Autowired private ImageService imageService; @PostMapping("/watermark") public ResponseEntity<String> addWatermark(@RequestParam("file") MultipartFile file, @RequestParam("text") String text) { try { BufferedImage sourceImage = ImageIO.read(file.getInputStream()); BufferedImage watermarkedImage = imageService.addWatermark(sourceImage, text); // 保存处理后的图片 File output = new File("watermarked_image.png"); imageService.saveImage(watermarkedImage, "png", output); return ResponseEntity.ok("Watermark added successfully. Saved as watermarked_image.png"); } catch (IOException e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to add watermark"); } } @PostMapping("/crop") public ResponseEntity<String> cropImage(@RequestParam("file") MultipartFile file, @RequestParam("x") int x, @RequestParam("y") int y, @RequestParam("width") int width, @RequestParam("height") int height) { try { BufferedImage sourceImage = ImageIO.read(file.getInputStream()); BufferedImage croppedImage = imageService.cropImage(sourceImage, x, y, width, height); // 保存处理后的图片 File output = new File("cropped_image.png"); imageService.saveImage(croppedImage, "png", output); return ResponseEntity.ok("Image cropped successfully. Saved as cropped_image.png"); } catch (IOException e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to crop image"); } } }4. 测试 API
你可以使用工具(如 Postman)来测试这些 API。
添加水印URL: POST http://localhost:8080/api/images/watermark参数:file: 上传的图片文件text: 水印文字裁剪图片URL: POST http://localhost:8080/api/images/crop参数:file: 上传的图片文件x: 裁剪区域的起始 x 坐标y: 裁剪区域的起始 y 坐标width: 裁剪区域的宽度height: 裁剪区域的高度总结通过上述步骤,你可以在 Spring Boot 应用中实现图片的水印和裁剪功能。这些功能可以根据具体需求进行扩展和优化。
网友回复