当前位置: 首页 > article >正文

SpringAI Alibaba实战文生图

1️⃣  前置准备:搭建开发环境与服务配置🚀

🔧 1.1 环境要求

        JDK 17+(推荐 JDK 21)、Spring Boot 3.x+(本案例使用 3.3.4)、阿里云百炼大模型服务 API Key。需在阿里云控制台完成服务开通并获取有效 API Key,用于后续身份验证。

 

🛠️ 1.2 Maven 依赖配置

        pom.xml中添加 Spring Boot Web 依赖、Spring AI Alibaba Starter,并配置 Spring Milestone 仓库以获取最新组件:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.4</version>
</parent>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId><version>1.0.0.1</version></dependency>
</dependencies><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository>
</repositories>

🔑 1.3 配置文件设置

        在application.yml中配置服务端口及阿里云 API Key:

server:port: 8080spring:ai:dashscope:api-key: "sk-xxx API_KEY"

 

2️⃣ 核心功能实现:基于 Spring AI 的文生图接口设计🎨

🖼️ 2.1  单图生成:获取图片 URL

接口设计

  GET /dashscope/image/generateImage,通过固定提示词 “为努力学习的自己生成一张励志海报” 调用模型,返回生成图片的 URL。

代码逻辑

        使用ImageModel注入模型实例,构造ImagePrompt并调用call()方法,校验返回的 URL 有效性后封装至响应体。若 URL 为空,抛出运行时异常提示生成失败。

example:

    /*** 返回生成图片URL* @return*/@GetMapping("/generateImage")public BaseResponse<String> generateImage() {ImagePrompt prompt = new ImagePrompt(PROMOTE);ImageResponse imageResponse = imageModel.call(prompt);String imageUrl = imageResponse.getResult().getOutput().getUrl();if (StrUtil.isEmpty(imageUrl)) {throw new RuntimeException("Image generation timeout or failed");}return ResultUtils.success(imageUrl);}

 

🖼️2.2  图片显示:流式传输图片内容

接口设计

   GET /dashscope/image,直接将生成的图片以流形式返回给客户端,支持浏览器直接渲染。

代码逻辑

        通过模型调用获取图片 URL 后,使用URLInputStream读取远程图片流,设置响应头为IMAGE_PNG_VALUE,将字节流写入HttpServletResponse。捕获 IO 异常并返回 500 状态码,确保错误处理的健壮性。

example:

    /*** 返回显示图片* @param response*/@GetMapping("/image")public void image(HttpServletResponse response) {ImagePrompt imagePrompt = new ImagePrompt(PROMOTE);ImageResponse imageResponse = imageModel.call(imagePrompt);String imageUrl = imageResponse.getResult().getOutput().getUrl();try {URL url = URI.create(imageUrl).toURL();InputStream in = url.openStream();response.setHeader("Content-Type", MediaType.IMAGE_PNG_VALUE);response.getOutputStream().write(in.readAllBytes());response.getOutputStream().flush();} catch (IOException e) {response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);}}

 

🖼️2.3  多图生成:批量生成图片集合

接口设计

  POST /dashscope/image/generate/multiImage,接收包含提示词和图片数量的请求体,支持生成 1-10 张图片。

代码逻辑

        校验输入参数合法性(图片数量范围、提示词非空),通过ImageOptionsBuilder构建批量生成选项,构造带选项的ImagePrompt。调用模型后解析ImageResponse,提取所有结果的 URL 并以集合形式返回,满足批量生成需求。

 /*** 返回生成多张图片URL* @param imageRequest* @return*/@PostMapping("/generate/multiImage")public BaseResponse<Set<String>> generateMultiImage(@RequestBody ImageRequest imageRequest) {String imagePrompt = imageRequest.getImagePrompt();int imageCount = imageRequest.getImageCount();if (imageCount < 1 || imageCount > 10) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}if (imagePrompt != null && StrUtil.isBlank(imagePrompt)) {throw new BusinessException(ErrorCode.PARAMS_ERROR,  "请输入图片描述提示词");}ImageOptions imageOptions = ImageOptionsBuilder.builder().N(imageCount).build();
//       # ImagePrompt 传递参数是 -- String 类型和 -- ImageOptions 类型ImagePrompt result = new ImagePrompt(imagePrompt, imageOptions);ImageResponse imageResponse = imageModel.call(result);Set<String> collect = imageResponse.getResults().stream().map(res -> res.getOutput().getUrl()).collect(Collectors.toSet());return ResultUtils.success(collect);}

3️⃣ 总结 📝

        Spring AI 提供的ImageModel抽象层简化了与阿里云百炼模型的交互,通过统一接口实现不同 AI 服务的无缝切换,适合快速落地文生图场景。

        应用场景可扩展至电商海报生成、营销图片批量制作、个性化图片定制等业务场景,结合用户输入动态生成视觉内容,提升产品智能化体验。

        通过以上实践,开发者可基于 Spring AI Alibaba 快速构建稳定、可扩展的文生图服务,充分利用 Java 生态与阿里云大模型的协同优势,实现 AI 功能的高效落地。

http://www.lryc.cn/news/2404046.html

相关文章:

  • GIC700组件
  • 几种简单的排序算法(C语言)
  • RTOS学习之重难点
  • 有没有 MariaDB 5.5.56 对应 MySQL CONNECTION_CONTROL 插件
  • setting up Activiti BPMN Workflow Engine with Spring Boot
  • 使用 C/C++ 和 OpenCV 提取图像的感兴趣区域 (ROI)
  • TripGenie:畅游济南旅行规划助手:个人工作纪实(二十二)
  • 如何用AI高效运营1000+Tiktok矩阵账号
  • 杭州瑞盟 MS35774/MS35774A 低噪声256细分微步进电机驱动,用于空调风门电机驱动,香薰电机驱动
  • 【论文解读】Toolformer: 语言模型自学使用工具
  • 408第一季 - 数据结构 - 线性表II
  • 网络通讯知识——通讯分层介绍,gRPC,RabbitMQ分层
  • Linux与Windows切换使用Obsidian,出现 unexplained changes 问题的解决
  • 基于VMD-LSTM融合方法的F10.7指数预报
  • 35 C 语言字符串转数值函数详解:strtof、strtod、strtold(含 errno 处理、ERANGE 错误)
  • 解决 idea提示`SQL dialect is not configured` 问题
  • springboot的test模块使用Autowired注入失败
  • 日志收集工具-Filebeat
  • 【PCIe总线】 -- PCI、PCIe相关实现
  • Vue3学习(4)- computed的使用
  • 手机上网可以固定ip地址吗?详细解析
  • 电脑同时连接内网和外网的方法,附外网连接局域网的操作设置
  • 如何在Unity中实现点击一个按钮跳转到哔哩哔哩
  • DHCP 动态主机配置协议(Dynamic host configuration protocol)逐层封装过程: DHCP --> UDP --> IP
  • PySide6 GUI 学习笔记——常用类及控件使用方法(单行文本控件QLineEdit)
  • 【数据结构】6. 时间与空间复杂度
  • Python 函数全攻略:函数进阶(生成器、闭包、内置函数、装饰器、推导式)
  • 基于springboot的藏文古籍系统
  • 重构城市应急指挥布控策略 ——无人机智能视频监控的破局之道
  • 声音信号的基频检测(python版本)