你是否曾想过如何利用Stable Diffusion WebUI的API来生成图像?在本教程中,我们将向你展示如何使用这个功能,以及如何在生成的图像中添加元数据。让我们开始吧!
故事开端
一天,你突然产生了一个创意,想要创建一堆有趣的狗狗图像。但是,手工绘制成百上千张图像太费时费力了。正巧,你听说了Stable Diffusion WebUI,它提供了一个强大的API,可以自动生成图像。于是,你决定探索如何使用它来实现你的创意。
步骤1:设置环境
首先,你需要确保已经成功安装和运行了Stable Diffusion WebUI。你可以按照官方文档中的适用于你的操作系统和硬件的指南进行安装。
步骤2:了解API
Stable Diffusion WebUI提供了一个API,可以让你通过发送HTTP请求来生成图像。首先,你需要在WebUI的启动命令中添加 --api
参数,以启用API。在你的启动脚本中,可以这样设置:
set COMMANDLINE_ARGS=--api
一旦API启用,你可以在浏览器中访问 http://127.0.0.1:7860/docs
来查看API文档。接下来,我们将关注其中的两个关键端点:/sdapi/v1/txt2img
和 /sdapi/v1/png-info
。
步骤3:构建API请求
现在,让我们开始构建API请求。首先,你需要定义一个包含生成图像参数的JSON负载(payload)。以下是一个示例:
payload = {
"prompt": "可爱的小狗",
"steps": 5
}
你可以根据需要在负载中添加更多参数,如果不设置,默认参数将被使用。
步骤4:发送API请求
接下来,你需要使用Python的requests
库来发送API请求。以下是一个示例:
import requests
url = "http://127.0.0.1:7860"
response = requests.post(url=f'{url}/sdapi/v1/txt2img', json=payload)
确保URL与你的WebUI的URL匹配。一旦你执行了这段代码,WebUI将基于负载生成图像。但问题是,图像在哪里呢?
步骤5:处理API响应
一旦WebUI完成了其工作,API将响应存储在上面分配的变量response
中。响应包含三个条目:"images"
、"parameters"
和 "info"
。我们需要找到一种方法来从这些条目中获取信息。
首先,你可以使用以下代码将响应转换为易于处理的JSON格式:
import json
r = response.json()
现在,让我们分析这三个条目:
"images"
包含生成的图像,但它是一个巨大的字符串,我们需要解码它。以下是解码的方法:
from PIL import Image
import io
import base64
for i in r['images']:
image = Image.open(io.BytesIO(base64.b64decode(i.split(",", 1)[0])))
现在,你已经有了一个可以处理的图像,可以使用image.save('output.png')
来保存它。
-
"parameters"
显示发送给API的参数,这可能对你有用,但在这种情况下,我们更关心"info"
。 -
"info"
包含图像的元数据信息,你可以将其插入到图像中。为此,你需要将上面获取的图像发送到/sdapi/v1/png-info
端点。以下是如何实现的:
png_payload = {
"image": "data:image/png;base64," + i
}
response2 = requests.post(url=f'{url}/sdapi/v1/png-info', json=png_payload)
然后,你可以使用 response2.json().get("info")
获取信息。
步骤6:完整示例
以下是一个完整的示例代码,展示了如何使用Stable Diffusion WebUI的API生成图像并添加元数据:
import requests
import io
import base64
from PIL import Image
url = "http://127.0.0.1:7860"
payload = {
"prompt": "可爱的小狗",
"steps": 5
}
response = requests.post(url=f'{url}/sdapi/v1/txt2img', json=payload)
r = response.json()
for i in r['images']:
image = Image.open(io.BytesIO(base64.b64decode(i.split(",", 1)[0])))
png_payload = {
"image": "data:image/png;base64," + i
}
response2 = requests.post(url=f'{url}/sdapi/v1/png-info', json=png_payload)
pnginfo = PngImagePlugin.PngInfo()
pnginfo.add_text("parameters", response2.json().get("info"))
image.save('output.png', pnginfo=pnginfo)
步骤7:更改WebUI设置
有时,你可能希望更改WebUI的设置,例如CLIP跳过层级。你可以使用 /sdapi/v1/options
端点来实现这一点。以下是一个示例:
option_payload = {
"sd_model_checkpoint": "Anything-V3.0-pruned.ckpt [2700c435]",
"CLIP_stop_at_last_layers": 2
}
response = requests.post(url=f'{url}/sdapi/v1/options', json=option_payload)
这将使模型切换到你设置的模型,并将CLIP跳过层级设置为2。请注意,这与`
"override_settings" 不同,因为这个更改将持续生效,而
"override_settings"` 仅用于单个请求。
结束语
通过这个教程,你现在知道如何使用Stable Diffusion WebUI的API来生成图像,并且可以添加元数据。这为你提供了强大的图像生成工具,可以用于各种创意项目。祝你在探索世界各种有趣的图像生成任务时玩得开心!