環境和配置請看<二>Sping-AI alibaba 入門-記憶聊天及持久化
源代碼:https://github.com/springaialibaba/spring-ai-alibaba-examples/blob/main/spring-ai-alibaba-image-example/dashscope-image/src/main/java/com/alibaba/cloud/ai/example/image/dashscope/controller/DashScopeImageController.java
這里我只是給一個解釋版本,并稍微修改了一下
git:https://gitee.com/Yee99/spring-ai-alibaba-demo
Controller
@RestController
@RequestMapping("/image")
public class ImageController {// 注入的圖像生成模型,用于調用AI生成圖片的核心功能,在 org.springframework.ai.image.*包下private final ImageModel imageModel;// 默認提示語,用于基礎圖像生成場景,可不要//private static final String DEFAULT_PROMPT = "為人工智能生成一張富有科技感的圖片!";// 構造器注入ImageModel實例public ImageController(ImageModel imageModel) {this.imageModel = imageModel;}// 通過單個提示詞生成1張圖片@GetMapping("/signalImage")public void image(HttpServletResponse response,@RequestParam(value = "prompt") String prompt) {// 使用提示詞生成圖片ImageResponse imageResponse = imageModel.call(new ImagePrompt(prompt));// 提取生成的圖片URLString imageUrl = imageResponse.getResult().getOutput().getUrl();try {// 將圖片URL轉換為可讀流URL url = URI.create(imageUrl).toURL();InputStream in = url.openStream();// 設置響應頭為PNG格式response.setHeader("Content-Type", MediaType.IMAGE_PNG_VALUE);// 寫出圖片字節到HTTP響應輸出流response.getOutputStream().write(in.readAllBytes());response.getOutputStream().flush();} catch (IOException e) {// IO異常處理:設置500錯誤狀態碼response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);}}/*** 通過單個提示詞生成多張圖片*/// 多圖生成接口:GET請求,路徑為/multiPrompt@GetMapping("/multiImage")public ResponseEntity<Collection<String>> generateImageWithMultiPrompt(@RequestParam(value = "prompt") String prompt,// 圖片數量參數,默認生成2張@RequestParam(defaultValue = "2") int count) {// 創建圖片生成選項,指定生成數量ImageOptions options = ImageOptionsBuilder.builder().N(count).build();// 調用模型生成圖片ImageResponse response = imageModel.call(new ImagePrompt(prompt, options));// 提取所有圖片URL組成集合返回Set<String> imageSet = response.getResults().stream().map(result -> result.getOutput().getUrl()).collect(Collectors.toSet());return ResponseEntity.ok(imageSet);}/*** 多條件安全生成圖片*/// 多條件生成接口:GET請求,路徑為/multipleConditions@GetMapping("/multipleConditions")public ResponseEntity<?> multipleConditions(// 主題參數,默認值為"一只會編程的貓"@RequestParam(value = "subject", defaultValue = "一只會編程的貓") String subject,// 環境參數,默認值為"辦公室"@RequestParam(value = "environment", defaultValue = "辦公室") String environment,// 圖片高度參數,默認1024像素@RequestParam(value = "height", defaultValue = "1024") Integer height,// 圖片寬度參數,默認1024像素@RequestParam(value = "width", defaultValue = "1024") Integer width,// 風格參數,默認"生動"@RequestParam(value = "style", defaultValue = "生動") String style) {// 組合構建詳細提示詞String prompt = String.format("一個%s,置身于%s的環境中,使用%s的藝術風格,高清4K畫質,細節精致",subject, environment, style);// 創建圖片生成選項,指定尺寸ImageOptions options = ImageOptionsBuilder.builder().height(height).width(width).build();try {// 調用模型生成圖片ImageResponse response = imageModel.call(new ImagePrompt(prompt, options));// 返回生成的第一張圖片的URLreturn ResponseEntity.ok(response.getResult().getOutput().getUrl());} catch (Exception e) {// 異常處理:返回包含錯誤信息的500響應return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("error", "圖像生成失敗","message", e.getMessage(),"timestamp", LocalDateTime.now()));}}}
注意:
- 如果使用signalImage,但是讓它生成兩張圖片的時候,仍舊生成一張圖片,并且融合你描述的兩個圖片
- http://localhost:8080/image/signalImage?prompt=生成兩張圖片,一張是小貓,一張是小狗