Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo

文章目录

  • [Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo](#Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo)

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

  1. 访问阿里云百炼平台并登录你的账号
  2. 开通"百炼大模型"服务(新用户通常有一定免费额度)
  3. 在控制台中生成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通过以下组件实现文生图功能:

  1. ImageModel:抽象的图像生成模型接口
  2. ImagePrompt:封装输入提示词和参数
  3. 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能力。尝试不同的提示词,发挥创造力,让你的应用更具智能化!

参考资源

希望本教程对你有所帮助,如有问题欢迎在评论区讨论!

相关推荐
Wise玩转AI4 小时前
Day 27|智能体的 UI 与用户交互层
人工智能·python·ui·ai·chatgpt·ai智能体
CoderJia程序员甲5 小时前
GitHub 热榜项目 - 日榜(2025-12-1)
ai·开源·llm·github·ai教程
轻竹办公PPT5 小时前
轻竹论文:毕业论文AI写作教程
人工智能·ai·ai写作
xcLeigh8 小时前
AI的提示词专栏:Prompt 与传统机器学习特征工程的异同
人工智能·机器学习·ai·prompt·提示词
带刺的坐椅9 小时前
Solon AI 开发学习8 - chat - Vision(理解)图片、声音、视频
java·ai·solon·mcp
A达峰绮9 小时前
AI时代下的护城河:哪些行业正被重塑,哪些将永不消失?
人工智能·ai·aigc
AI360labs_atyun12 小时前
学习教学AI指南,附4个提示词指令(Prompts)
人工智能·科技·学习·ai·chatgpt
科普瑞传感仪器13 小时前
从“盲插”到“智插”:六维力控制技术如何革新PCBA自动化装配?
运维·人工智能·科技·ai·机器人·自动化·无人机
TDengine (老段)13 小时前
一文讲清 TDengine IDMP 资产数据导入
大数据·数据库·ai·时序数据库·tdengine·涛思数据
羊仔AI探索15 小时前
GLM-4.6接入Claude Code插件,国内丝滑编程
ide·人工智能·ai·aigc·ai编程