图像处理
大约 6 分钟
第八章:图像处理
8.1 图像生成
Spring AI提供了强大的图像生成功能,支持多种AI模型。
8.1.1 基础图像生成
@RestController
public class ImageGenerationController {
private final ImageClient imageClient;
public ImageGenerationController(ImageClient imageClient) {
this.imageClient = imageClient;
}
@GetMapping("/image/generate")
public String generateImage(@RequestParam String prompt) {
ImagePrompt imagePrompt = new ImagePrompt(prompt);
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
}
}8.1.2 高级图像生成选项
@GetMapping("/image/advanced")
public String generateAdvancedImage(
@RequestParam String prompt,
@RequestParam(defaultValue = "1024x1024") String size,
@RequestParam(defaultValue = "1") int n,
@RequestParam(defaultValue = "dall-e-3") String model) {
ImagePrompt imagePrompt = new ImagePrompt(prompt);
ImageOptions imageOptions = ImageOptions.builder()
.withModel(model)
.withN(n)
.withSize(size)
.build();
ImageResponse response = imageClient.generate(imagePrompt, imageOptions);
return response.getResult().getOutput().getUrl();
}8.1.3 图像风格控制
@GetMapping("/image/style")
public String generateStyledImage(
@RequestParam String prompt,
@RequestParam String style) {
String styledPrompt = "Generate an image in " + style + " style: " + prompt;
ImagePrompt imagePrompt = new ImagePrompt(styledPrompt);
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
}8.2 图像分析
8.2.1 基础图像分析
@RestController
public class ImageAnalysisController {
private final ImageClient imageClient;
public ImageAnalysisController(ImageClient imageClient) {
this.imageClient = imageClient;
}
@PostMapping("/image/analyze")
public String analyzeImage(@RequestParam MultipartFile image) {
ImagePrompt imagePrompt = new ImagePrompt(image, "Analyze this image");
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getContent();
}
}8.2.2 对象检测
@PostMapping("/image/detect-objects")
public ObjectDetectionResult detectObjects(@RequestParam MultipartFile image) {
ImagePrompt imagePrompt = new ImagePrompt(image, "Detect objects in this image");
ImageResponse response = imageClient.generate(imagePrompt);
return parseObjectDetection(response.getContent());
}
private ObjectDetectionResult parseObjectDetection(String content) {
// 实现对象检测结果解析
return new ObjectDetectionResult();
}
public class ObjectDetectionResult {
private List<String> objects;
private Map<String, Integer> counts;
// getters and setters
}8.2.3 场景识别
@PostMapping("/image/recognize-scene")
public SceneRecognitionResult recognizeScene(@RequestParam MultipartFile image) {
ImagePrompt imagePrompt = new ImagePrompt(image, "Recognize the scene in this image");
ImageResponse response = imageClient.generate(imagePrompt);
return parseSceneRecognition(response.getContent());
}
private SceneRecognitionResult parseSceneRecognition(String content) {
// 实现场景识别结果解析
return new SceneRecognitionResult();
}
public class SceneRecognitionResult {
private String scene;
private List<String> elements;
private String mood;
// getters and setters
}8.3 图像描述
8.3.1 基础图像描述
@PostMapping("/image/describe")
public String describeImage(@RequestParam MultipartFile image) {
ImagePrompt imagePrompt = new ImagePrompt(image, "Describe this image in detail");
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getContent();
}8.3.2 多语言图像描述
@PostMapping("/image/describe/multi-language")
public Map<String, String> describeImageInMultipleLanguages(
@RequestParam MultipartFile image,
@RequestParam List<String> languages) {
Map<String, String> descriptions = new HashMap<>();
for (String language : languages) {
ImagePrompt imagePrompt = new ImagePrompt(image, "Describe this image in " + language);
ImageResponse response = imageClient.generate(imagePrompt);
descriptions.put(language, response.getContent());
}
return descriptions;
}8.3.3 详细图像分析
@PostMapping("/image/analyze-detail")
public ImageAnalysis analyzeImageDetail(@RequestParam MultipartFile image) {
ImagePrompt imagePrompt = new ImagePrompt(image, "Analyze this image in detail");
ImageResponse response = imageClient.generate(imagePrompt);
return parseDetailedAnalysis(response.getContent());
}
private ImageAnalysis parseDetailedAnalysis(String content) {
// 实现详细图像分析结果解析
return new ImageAnalysis();
}
public class ImageAnalysis {
private String description;
private List<String> objects;
private String style;
private String mood;
private Map<String, Object> metadata;
// getters and setters
}8.4 图像编辑
8.4.1 图像编辑基础
@PostMapping("/image/edit")
public String editImage(
@RequestParam MultipartFile image,
@RequestParam String editInstruction) {
ImagePrompt imagePrompt = new ImagePrompt(image, editInstruction);
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
}8.4.2 图像风格转换
@PostMapping("/image/transform-style")
public String transformImageStyle(
@RequestParam MultipartFile image,
@RequestParam String targetStyle) {
String instruction = "Transform this image to " + targetStyle + " style";
ImagePrompt imagePrompt = new ImagePrompt(image, instruction);
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
}8.4.3 图像修复
@PostMapping("/image/restore")
public String restoreImage(@RequestParam MultipartFile damagedImage) {
ImagePrompt imagePrompt = new ImagePrompt(damagedImage, "Restore this damaged image");
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
}8.5 高级图像处理技术
8.5.1 图像合成
@PostMapping("/image/composite")
public String compositeImages(
@RequestParam List<MultipartFile> images,
@RequestParam String compositionInstruction) {
StringBuilder compositePrompt = new StringBuilder("Composite these images: ");
for (MultipartFile image : images) {
compositePrompt.append(image.getOriginalFilename()).append(", ");
}
compositePrompt.append("\n").append(compositionInstruction);
ImagePrompt imagePrompt = new ImagePrompt(compositePrompt.toString());
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
}8.5.2 图像变体生成
@PostMapping("/image/variations")
public List<String> generateImageVariations(@RequestParam MultipartFile image) {
ImagePrompt imagePrompt = new ImagePrompt(image, "Generate variations of this image");
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getVariations();
}8.5.3 文本到图像生成
@PostMapping("/image/text-to-image")
public String generateImageFromText(@RequestBody ImageGenerationRequest request) {
ImagePrompt imagePrompt = new ImagePrompt(request.getText());
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
}
public class ImageGenerationRequest {
private String text;
private String style;
private int count;
// getters and setters
}8.6 实际应用示例
8.6.1 产品图像生成器
@Service
public class ProductImageGenerator {
private final ImageClient imageClient;
public ProductImageGenerator(ImageClient imageClient) {
this.imageClient = imageClient;
}
public String generateProductImage(
String productName,
String productDescription,
String style) {
String prompt = "Generate a product image for: " + productName + "\n" +
"Description: " + productDescription + "\n" +
"Style: " + style;
ImagePrompt imagePrompt = new ImagePrompt(prompt);
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
}
}8.6.2 社交媒体图像生成器
@Service
public class SocialMediaImageGenerator {
private final ImageClient imageClient;
public SocialMediaImageGenerator(ImageClient imageClient) {
this.imageClient = imageClient;
}
public String generateSocialMediaImage(
String postContent,
String platform,
String style) {
String prompt = "Generate a " + platform + " image for: " + postContent + "\n" +
"Style: " + style;
ImagePrompt imagePrompt = new ImagePrompt(prompt);
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
}
}8.6.3 艺术图像生成器
@Service
public class ArtImageGenerator {
private final ImageClient imageClient;
public ArtImageGenerator(ImageClient imageClient) {
this.imageClient = imageClient;
}
public String generateArtImage(
String artStyle,
String subject,
String mood) {
String prompt = "Generate " + artStyle + " art of " + subject + " with " + mood + " mood";
ImagePrompt imagePrompt = new ImagePrompt(prompt);
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
}
}8.7 性能优化
8.7.1 图像缓存
@Configuration
@EnableCaching
public class ImageCacheConfig {
@Bean
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Arrays.asList(
new ConcurrentMapCache("generated-images"),
new ConcurrentMapCache("image-analyses")
));
return cacheManager;
}
}8.7.2 批量图像处理
@RestController
public class BatchImageController {
private final ImageClient imageClient;
public BatchImageController(ImageClient imageClient) {
this.imageClient = imageClient;
}
@PostMapping("/image/batch")
public List<String> batchGenerateImages(@RequestBody List<ImageGenerationRequest> requests) {
return requests.stream()
.map(request -> {
ImagePrompt imagePrompt = new ImagePrompt(request.getText());
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
})
.collect(Collectors.toList());
}
}8.8 错误处理
8.8.1 图像处理异常
@RestControllerAdvice
public class ImageProcessingExceptionHandler {
@ExceptionHandler(ImageProcessingException.class)
public ResponseEntity<ErrorResponse> handleImageProcessingError(ImageProcessingException ex) {
ErrorResponse error = new ErrorResponse(
"IMAGE_PROCESSING_ERROR",
"图像处理失败: " + ex.getMessage()
);
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
}8.8.2 图像大小限制处理
@Service
public class ImageSizeHandler {
private final ImageClient imageClient;
public ImageSizeHandler(ImageClient imageClient) {
this.imageClient = imageClient;
}
public String handleLargeImage(MultipartFile image) {
if (image.getSize() > 5 * 1024 * 1024) { // 5MB
// 压缩或调整图像大小
MultipartFile resizedImage = resizeImage(image);
return processImage(resizedImage);
}
return processImage(image);
}
private MultipartFile resizeImage(MultipartFile image) {
// 实现图像压缩逻辑
return image;
}
private String processImage(MultipartFile image) {
ImagePrompt imagePrompt = new ImagePrompt(image, "Process this image");
ImageResponse response = imageClient.generate(imagePrompt);
return response.getResult().getOutput().getUrl();
}
}8.9 监控与日志
8.9.1 图像处理指标
@RestController
public class ImageProcessingMetricsController {
private final MeterRegistry meterRegistry;
public ImageProcessingMetricsController(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
@GetMapping("/image-processing/metrics")
public Map<String, Object> getMetrics() {
return Map.of(
"totalImagesProcessed", meterRegistry.counter("image.processing.total").count(),
"averageProcessingTime", meterRegistry.timer("image.processing.time").mean(),
"errorRate", meterRegistry.counter("image.processing.errors").count() /
(meterRegistry.counter("image.processing.total").count() + 1.0)
);
}
}8.9.2 图像处理日志
@Configuration
public class ImageProcessingLogging {
@Bean
public ImageClient loggingImageClient(ImageClient imageClient) {
return new ImageClient() {
@Override
public ImageResponse generate(ImagePrompt prompt) {
long startTime = System.currentTimeMillis();
try {
ImageResponse response = imageClient.generate(prompt);
long duration = System.currentTimeMillis() - startTime;
log.info("图像处理 - 耗时: {}ms, Prompt: {}", duration, prompt);
return response;
} catch (Exception ex) {
log.error("图像处理失败", ex);
throw ex;
}
}
// 实现其他方法...
};
}
}8.10 小结
本章详细介绍了图像处理技术:
- 图像生成:掌握基础和高级图像生成技术
- 图像分析:学习对象检测和场景识别
- 图像描述:了解多语言描述和详细分析
- 图像编辑:掌握图像编辑和风格转换
- 高级技术:学习图像合成和变体生成
- 实际应用:了解产品图像、社交媒体图像等实际场景
- 性能优化:掌握图像缓存和批量处理
- 错误处理:了解图像处理异常和大小限制处理
- 监控日志:掌握图像处理指标和日志记录
在下一章中,我们将学习Prompt工程的高级技术。 点击这里👇🏻获取:100万QPS短链系统、复杂的商城微服务系统、智能翻译助手AI Agent、SaaS点餐系统、刷题吧小程序、商城系统、秒杀系统、AI项目、代码生成神器、苏三demo项目、智能天气播报AI Agent、智能代码审查AI Agent等 10 个项目的:项目源代码、开发教程和技术答疑
