🔆2025-04-15

实现第一个图像生成Hello World(Stable Diffusion模型)

基于沐曦+Gitee平台的40+个大模型,采用vscode/Chatbox和Serverless API开发创意型案例,跟踪最新开源模型和编程开发形成案例。
本案例使用vscode调用Gitee-Stable Diffusion接口

什么是Stable Diffusion

参考链接1️⃣2️⃣3️⃣
简而言之,就是:文生图 / Text-to-Image

Gitee

你需要按照以下顺序操作:

  1. 注册/登录Gitee账号
  2. 访问Gitee AI 模力方舟
  3. 在模力方舟页面中,找到并启用沐曦-模型资源包

获取Stable Diffusion API

  1. 选中沐曦模型资源包后,下拉找到stable-diffusion-xl-base-1.0模型
  2. 选择在线体验->API->添加令牌,会发现代码中的api-key已被正确替换(此处若无法选择记得先登录)

关于API代码,你需要知道:

  • 模型资源地址 API的基础URL(统一资源定位符)
  • API密钥 用于身份验证和授权,以保证用户正常访问。(注意!你会发现其他模型的api-key和此模型都是完全相同的,因为gitee ai的api-key分配模式是一个账号一个)
  • 模型名称 指向模型完整名称(一定不能错)

对于Gitee的三种API代码:
1️⃣Python

2️⃣JavaScript

3️⃣cURL

❓️如果你发现这里的curl地址不同于上面的baseurl
真聪明!(我这里说话好像ai)这里的url比基础url多了两个资源路径images/generations
这里涉及到curl命令:通过命令行直接执行HTTP请求,主要用来测试和调试API。因此其需要包含完整的请求url(包括基础url和资源路径)。

个人对url的具体理解:api发送请求的目标地址,这里直接指向stable-diffusion模型中的图像生成服务。
其中:
ai.gitee.com:使用gitee平台上的AI服务(此网址可以直接访问)
/v1/images/generations:具体的”模型版本/图像/生成”的路径

使用vscode调用gitee-Stable Diffusion-API

到这问题就不大了,正常拿个.py文件放上API代码,根据你的需求进行个性化调整。
记得缺失的包pip install一下

代码思路

  1. 导包
import requests                  #HTTP通信
import json                      #json数据序列化
from dotenv import load_dotenv   #安全配置
import os                        #系统交互
import base64                    #数据编码
from io import BytesIO           #二进制流处理
from PIL import Image            #图像操作
  1. 配置环境变量load_dotenv()
  • API_URL
  • API_KEY

    为了降低泄露风险、确保安全性,请一定使用用私有环境变量进行KEY的配置,不要直接把key写在代码里!

  1. 协议配置 & 数据格式声明headers
headers = {
    "Authorization": f"Bearer {API_KEY}", #认证协议
    "Content-Type": "application/json"    #数据格式声明
}

4.向API发送请求时所需的参数payload

payload = {                                    #请求参数(根据文档调整)
    "model": "stable-diffusion-xl-base-1.0",   #模型选择
    "prompt": "一只穿着宇航服的猫在月球上漫步",   #业务输入
    "n": 1,                                    #生成数量
    "size": "1024x1024",                       #输出规格
    "response_format": "b64_json"              #数据返回格式
}

5.向API发送请求 & 处理响应结果

使用try-except异常处理结构,用于捕获并处理在请求API和处理响应过程中可能出现的异常,确保程序在遇到错误时不会崩溃,而是输出相应的错误信息。

try:
    print(f"请求API: {API_URL}")
    response = requests.post(API_URL, headers=headers, json=payload)
    
    if response.status_code == 200:
        result = response.json()
        if "data" in result and len(result["data"]) > 0:
            # 处理base64图像数据
            image_data = base64.b64decode(result["data"][0]["b64_json"])
            image = Image.open(BytesIO(image_data))
            
            # 保存图像
            output_path = "generated_image.png"
            image.save(output_path)
            print(f"图像生成成功,已保存到: {output_path}")
            image.show()
        else:
            print("API响应中没有有效的图像数据")
    else:
        print(f"请求失败,状态码: {response.status_code}")
        print(response.text)

except Exception as e:
    print(f"发生错误: {str(e)}")

后续问题扩展

如果你成功调用Stable Diffusion模型的API,并输入中文提示词,会发现生成的图几乎不相关…因此后续需要对提示词prompt进行调整。

下方 ↓ 跳转查看下一篇文章【实战2️⃣ 接入DeepSeek-R1优化提示词】。