文章目录
- [Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo](#Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo)
-
- 一、什么是文生图?
- 二、环境准备
-
- [1. 环境要求](#1. 环境要求)
- [2. 获取API Key](#2. 获取API Key)
- [三、创建Spring Boot项目](#三、创建Spring Boot项目)
-
- [1. 初始化项目](#1. 初始化项目)
- [2. 配置pom.xml](#2. 配置pom.xml)
- 四、配置应用参数
-
- [1. 配置API Key](#1. 配置API Key)
- [2. 可选模型配置](#2. 可选模型配置)
- 五、实现文生图接口
-
- [1. 创建ImageController](#1. 创建ImageController)
- [2. 进阶版本:支持自定义参数](#2. 进阶版本:支持自定义参数)
- [3. 直接返回图片的接口](#3. 直接返回图片的接口)
- 完整ImageController代码
- 六、创建应用启动类
- 七、运行和测试
-
- [1. 启动应用](#1. 启动应用)
- [2. 测试文生图功能](#2. 测试文生图功能)
- [3. 提示词技巧](#3. 提示词技巧)
- 八、常见问题及解决方案
-
- [1. 依赖解析失败](#1. 依赖解析失败)
- [2. API Key错误](#2. API Key错误)
- [3. 生成时间较长](#3. 生成时间较长)
- [4. 同步与异步调用](#4. 同步与异步调用)
- 九、核心原理简介
- 十、总结
Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo
本文面向初学Spring AI Alibaba的开发者,手把手教你实现文生图功能。
本文将详细介绍如何使用 Spring AI Alibaba 框架快速集成阿里云百炼大模型服务,实现文生图(Text-to-Image)功能。通过本教程,你将学会创建一个简单的Spring Boot应用,只需几行代码就能让AI根据你的文字描述生成图片。
一、什么是文生图?
文生图是指通过文字描述生成对应图像的技术。在没有AI之前,要获得符合自己想法的图片通常需要自己绘制(需要美术功底)、拍照或付费请专业人士制作。而现在,借助AI大模型,我们只需将想法(提示词)告诉AI,程序就能生成相应的图片。
二、环境准备
1. 环境要求
在开始之前,请确保你的开发环境满足以下要求:
- JDK 17及以上(本文使用JDK 17)
- Spring Boot 3.x及以上(本文使用Spring Boot 3.5.7)
- Maven 3.6及以上
2. 获取API Key
- 访问阿里云百炼平台并登录你的账号
- 开通"百炼大模型"服务(新用户通常有一定免费额度)
- 在控制台中生成API Key并保存

使用某个模型时,建议开启该模型的"免费额度用完即停"功能,防止测试中超额扣费。


三、创建Spring Boot项目
1. 初始化项目
访问 start.spring.io 快速创建项目,配置如下:
- Project: Maven
- Language: Java
- Spring Boot: 3.5.7
- Group: com.example
- Artifact: spring-ai-demo
- Java: 17
- Dependencies: Spring Web
点击"Generate"下载项目压缩包并解压到本地。

2. 配置pom.xml
在pom.xml中添加Spring AI Alibaba依赖和仓库配置:
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.7</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>spring-ai-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-ai-demo</name>
<properties>
<java.version>17</java.version>
</properties>
<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</artifactId>
<version>1.0.0-M5.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 添加Spring Milestones仓库 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
由于Spring AI相关依赖尚未发布到中央仓库,所以需要添加Spring Milestones仓库。
四、配置应用参数
- 这里的API_KEY是上面获取的阿里云百炼的key
1. 配置API Key
在src/main/resources/application.yml中添加配置:
yaml
spring:
application:
name: spring-ai-demo
ai:
dashscope:
api-key: ${AI_DASHSCOPE_API_KEY}
image:
options:
model: qwen-image-edit-plus
安全提示:不建议将API Key直接写在代码中,可以通过环境变量设置:
Windows系统:
cmd
set AI_DASHSCOPE_API_KEY=你的API_KEY
Mac/Linux系统:
bash
export AI_DASHSCOPE_API_KEY=你的API_KEY
2. 可选模型配置
Spring AI Alibaba支持多种文生图模型,初期可免费使用,可以在配置文件中指定:

yaml
spring:
ai:
dashscope:
api-key: ${AI_DASHSCOPE_API_KEY}
image:
options:
model: wan2.5-t2i-preview # 可选模型
常用模型有:
- wan2.5-i2i-preview
- qwen-image-edit-plus
- wan2.5-t2i-preview
五、实现文生图接口
1. 创建ImageController
创建ImageController.java文件,实现文生图功能:
java
package com.example.spring_ai_demo.controller;
import org.springframework.ai.image.ImageModel;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/ai")
public class ImageController {
private final ImageModel imageModel;
public ImageController(ImageModel imageModel) {
this.imageModel = imageModel;
}
@GetMapping("/image")
public String generateImage(@RequestParam(value = "input", defaultValue = "一只在草地上玩耍的可爱小猫") String input) {
ImagePrompt imagePrompt = new ImagePrompt(input);
ImageResponse response = imageModel.call(imagePrompt);
String imageUrl = response.getResult().getOutput().getUrl();
return "redirect:" + imageUrl;
}
}
2. 进阶版本:支持自定义参数
如需更多控制,可以使用ImageOptions自定义参数:
java
package com.example.spring_ai_demo.controller;
import org.springframework.ai.image.ImageModel;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.image.ImageOptionsBuilder;
import org.springframework.ai.image.ImageOptions;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/ai")
public class ImageModelController {
private final ImageModel imageModel;
public ImageModelController(ImageModel imageModel) {
this.imageModel = imageModel;
}
@GetMapping("/image/advanced")
public String generateImageAdvanced(
@RequestParam String input,
@RequestParam(defaultValue = "wan2.5-t2i-preview") String model,
@RequestParam(defaultValue = "1024") int width,
@RequestParam(defaultValue = "1024") int height) {
ImageOptions options = ImageOptionsBuilder.builder()
.model(model)
.width(width)
.height(height)
.build();
ImagePrompt imagePrompt = new ImagePrompt(input, options);
ImageResponse response = imageModel.call(imagePrompt);
String imageUrl = response.getResult().getOutput().getUrl();
return "生成的图片URL: " + imageUrl + "<br><img src='" + imageUrl + "' alt='生成的图片'>";
}
}
3. 直接返回图片的接口
如果需要直接返回图片数据,可以使用以下实现:
java
@GetMapping("/image/direct")
public void generateImageDirect(
@RequestParam String input,
HttpServletResponse response) throws IOException {
ImageResponse imageResponse = imageModel.call(new ImagePrompt(input));
String imageUrl = imageResponse.getResult().getOutput().getUrl();
try (InputStream in = URI.create(imageUrl).toURL().openStream()) {
response.setHeader("Content-Type", "image/png");
response.getOutputStream().write(in.readAllBytes());
response.getOutputStream().flush();
}
}
完整ImageController代码
java
package com.example.spring_ai_demo.controller;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.ai.image.*;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
@RestController
@RequestMapping("/ai")
public class ImageController {
private final ImageModel imageModel;
public ImageController(ImageModel imageModel) {
this.imageModel = imageModel;
}
@GetMapping("/image")
public String generateImage(@RequestParam(value = "input", defaultValue = "一只在草地上玩耍的可爱小猫") String input) {
ImagePrompt imagePrompt = new ImagePrompt(input);
ImageResponse response = imageModel.call(imagePrompt);
String imageUrl = response.getResult().getOutput().getUrl();
return "redirect:" + imageUrl;
}
@GetMapping("/image/advanced")
public String generateImageAdvanced(
@RequestParam String input,
@RequestParam(defaultValue = "wan2.5-t2i-preview") String model,
@RequestParam(defaultValue = "1024") int width,
@RequestParam(defaultValue = "1024") int height) {
ImageOptions options = ImageOptionsBuilder.builder()
.model(model)
.width(width)
.height(height)
.build();
ImagePrompt imagePrompt = new ImagePrompt(input, options);
ImageResponse response = imageModel.call(imagePrompt);
String imageUrl = response.getResult().getOutput().getUrl();
return "生成的图片URL: " + imageUrl + "<br><img src='" + imageUrl + "' alt='生成的图片'>";
}
@GetMapping("/image/direct")
public void generateImageDirect(
@RequestParam String input,
HttpServletResponse response) throws IOException {
ImageResponse imageResponse = imageModel.call(new ImagePrompt(input));
String imageUrl = imageResponse.getResult().getOutput().getUrl();
try (InputStream in = URI.create(imageUrl).toURL().openStream()) {
response.setHeader("Content-Type", "image/png");
response.getOutputStream().write(in.readAllBytes());
response.getOutputStream().flush();
}
}
}
六、创建应用启动类
确保在项目中有Spring Boot启动类:
java
package com.example.spring_ai_demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringAiDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringAiDemoApplication.class, args);
System.out.println("============== Spring AI Demo启动成功 ==============");
System.out.println("============== 文生图测试地址: http://localhost:8080/ai/image?input=你的提示词 ==============");
}
}
七、运行和测试
1. 启动应用
直接在IDE中运行SpringAiDemoApplication类。

2. 测试文生图功能
由于大模型生产需要时间,所以接口返回时间较长,调用接口后请耐心等待!!!
打开浏览器,访问以下地址进行测试:
http://localhost:8080/ai/image?input=一只在太空站穿宇航服的猫
调用效果如下:
或者使用自定义参数版本:
http://localhost:8080/ai/image/advanced?input=冬天的梅花&model=wan2.5-t2i-preview&width=1024&height=1024
调用效果如下:

3. 提示词技巧
为了提高生成图片的质量,可以尝试以下提示词技巧:
- 具体描述:"一只在草地上玩耍的橘色小猫,阳光明媚,背景有花朵"
- 风格指定:"水彩画风格,一座被樱花环绕的日本传统寺庙"
- 细节描述:"富有科技感的未来城市,飞行汽车,霓虹灯光,赛博朋克风格"
八、常见问题及解决方案
1. 依赖解析失败
如果出现依赖解析错误,请确保:
- 已正确配置Spring Milestones仓库
- 使用的是推荐的Spring Boot和JDK版本
2. API Key错误
如果遇到认证错误:
- 检查API Key是否正确设置
- 确认百炼大模型服务已开通
- 验证API Key是否有足够的余额或免费额度
3. 生成时间较长
文生图功能可能需要一定时间(通常30-70秒),这是正常现象。
4. 同步与异步调用
本文示例使用的是同步调用方式,Spring AI Alibaba也支持异步调用,适合生成时间较长的场景。
九、核心原理简介
Spring AI Alibaba通过以下组件实现文生图功能:
- ImageModel:抽象的图像生成模型接口
- ImagePrompt:封装输入提示词和参数
- ImageResponse:包含生成结果的响应
框架自动装配了与阿里云百炼服务通信的组件,开发者只需关注业务逻辑。
十、总结
通过本教程,你已成功实现了:
- ✅ 创建Spring Boot项目并集成Spring AI Alibaba
- ✅ 配置阿里云百炼大模型服务
- ✅ 实现文生图接口
- ✅ 通过HTTP API生成图片
完整项目结构:
spring-ai-demo
├── src/main/java
│ └── com/example/spring_ai_demo
│ ├── controller
│ │ └── ImageController.java
│ └── SpringAiDemoApplication.java
├── src/main/resources
│ └── application.yml
└── pom.xml
现在你可以继续探索Spring AI的更多功能,如文本生成、语音合成等多模态AI能力。尝试不同的提示词,发挥创造力,让你的应用更具智能化!
参考资源:
希望本教程对你有所帮助,如有问题欢迎在评论区讨论!