【ComfyUI】python调用生图API,实现批量出图

官方给的示例:

https://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.py

一、环境准备

1.1 comfyui环境安装参考

【本地运行AI绘画】ComfyUI的安装与使用(一)(windows+1660ti 6G显存)

1.2  调用可能需要安装的python包 

对应  import websocket

pip install websocket-client 
pip install json 

1.3 comfyui打开开发者模式,可以直接下载任意工作流 api文件

1.3.1 在英文最新界面打开

1.3.2  中文老界面打开

1.4 加载默认工作流,下载api,看看

保存结果是基本json 与工作流相似 不要弄混了

二、 代码

2.1  指定任意模型进行生图(找到名字和在api中的位置)

局部代码

def text_to_image(prompt_text,
                  model_name="SD1.X/dreamshaper_8.safetensors",
                  seed=6,
                  steps=20,
                  width=512,
                  height=256,
                  batch_size=2,
                  local_save_dir='./output',
                  api_file='api_demo.json'
                  
                  ):
    prompt = read_json(api_file)
    prompt["3"]["inputs"]["seed"] = seed  # 换一个数字不一样的图
    prompt["3"]["inputs"]["steps"] =steps   # 换一个数字不一样的图
    prompt["4"]["inputs"]["ckpt_name"] = model_name
    prompt["5"]["inputs"]["width"] = width
    prompt["5"]["inputs"]["height"] = height
    prompt["5"]["inputs"]["batch_size"]=batch_size

    prompt["6"]["inputs"]["text"] = prompt_text  

2.1.1  运行结果

2.1.2 参数解析

在comfyui的界面里确认有的模型名免得传错

打开保存的  api_demo.json,找到相应的代码改写

2.1.3 完整代码

#This is an example that uses the websockets api to know when a prompt execution is done
#Once the prompt execution is done it downloads the images using the /history endpoint

import websocket #NOTE: websocket-client (https://github.com/websocket-client/websocket-client) #  pip install websocket-client
import uuid
import json
import urllib.request
import urllib.parse
import os

server_address = "127.0.0.1:8188"
client_id = str(uuid.uuid4())

def queue_prompt(prompt):
    p = {"prompt": prompt, "client_id": client_id}
    data = json.dumps(p).encode('utf-8')
    req =  urllib.request.Request("http://{}/prompt".format(server_address), data=data)
    return json.loads(urllib.request.urlopen(req).read())

def get_image(filename, subfolder, folder_type):
    data = {"filename": filename, "subfolder": subfolder, "type": folder_type}
    url_values = urllib.parse.urlencode(data)
    with urllib.request.urlopen("http://{}/view?{}".format(server_address, url_values)) as response:
        return response.read()

def get_history(prompt_id):
    with urllib.request.urlopen("http://{}/history/{}".format(server_address, prompt_id)) as response:
        return json.loads(response.read())

def get_images(ws, prompt):
    prompt_id = queue_prompt(prompt)['prompt_id']
    output_images = {}
    while True:
        out = ws.recv()
        if isinstance(out, str):
            message = json.loads(out)
            if message['type'] == 'executing':
                data = message['data']
                if data['node'] is None and data['prompt_id'] == prompt_id:
                    break #Execution is done
        else:
            # If you want to be able to decode the binary stream for latent previews, here is how you can do it:
            # bytesIO = BytesIO(out[8:])
            # preview_image = Image.open(bytesIO) # This is your preview in PIL image format, store it in a global
            continue #previews are binary data

    history = get_history(prompt_id)[prompt_id]
    for node_id in history['outputs']:
        node_output = history['outputs'][node_id]
        images_output = []
        if 'images' in node_output:
            for image in node_output['images']:
                image_data = get_image(image['filename'], image['subfolder'], image['type'])
                images_output.append(image_data)
        output_images[node_id] = images_output

    return output_images

def read_json(api_file="controlnet_api.json"):
    # print('api_file',api_file)
    with open (api_file,"r",encoding="utf-8") as file_json:
        prompt_text=json.load(file_json)
    return prompt_text

def text_to_image(prompt_text,
                  model_name="SD1.X/dreamshaper_8.safetensors",
                  seed=6,
                  steps=20,
                  width=512,
                  height=256,
                  batch_size=2,
                  local_save_dir='./output',
                  api_file='api_demo.json'
                  
                  ):
    prompt = read_json(api_file)
    prompt["3"]["inputs"]["seed"] = seed  # 换一个数字不一样的图
    prompt["3"]["inputs"]["steps"] =steps   # 换一个数字不一样的图
    prompt["4"]["inputs"]["ckpt_name"] = model_name
    prompt["5"]["inputs"]["width"] = width
    prompt["5"]["inputs"]["height"] = height
    prompt["5"]["inputs"]["batch_size"]=batch_size

    prompt["6"]["inputs"]["text"] = prompt_text  

    ws = websocket.WebSocket()
    ws.connect("ws://{}/ws?clientId={}".format(server_address, client_id))
    images = get_images(ws, prompt)

    
    os.makedirs(local_save_dir, exist_ok=True)
    for node_id in images:
        for i,image_data in enumerate(images[node_id]):
            from PIL import Image
            import io
            image = Image.open(io.BytesIO(image_data))
            # image.show()
            save_path=f"{local_save_dir}/{prompt_text[:20]}_{i}.png"
            image.save(save_path)
            print(f"Saved image to {save_path}")

    
    ws.close()

if __name__ == "__main__":
    text_to_image(
                  prompt_text="a boy",
                  api_file=r'D:\deploy2\api_demo.json')


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958331.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

推箱子游戏

java小游戏2 一游戏介绍 二图像准备 墙、箱子、人、箱子目的地,人左边、人右边、人上边、人下边 三结构准备 地图是什么,我们把地图想象成一个网格,每个格子就是工人每次移动的步长,也是箱子移动的距离,设置一个二维数…

软件鉴定测试重要性和流程分享

在当今快速发展的数字时代,软件系统的可靠性和安全性变得至关重要。越来越多的企业意识到,进行专业的软件鉴定与测试不仅是保证产品质量的必要步骤,也是提升市场竞争力的重要手段。软件鉴定测试指通过对软件进行评估和验证,以确保…

Linux C\C++编程-建立文件和内存映射

【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 Linu…

15-spring整合mybatis方式一

spring整合mybatis 方式一【重要】 步骤: 1.导入相关jar包 junit mybatis mysql数据库 spring相关的 aop织入 mybatis-spring 【new】 junit junit 4.12 mysql mysql-connector-java 8.0.23 org.mybatis mybatis 3.5.2 org.springframework spring-webmvc 5…

基于深度学习的视觉检测小项目(十五) 用户的登录界面

用户管理离不开的是消息框(QMessageBox)和对话框(QDialog),比如对话框用于用户名和密码输入,消息框用于提示登录成功、密码错误。 • 基础知识:PySide6(PyQT5)的常用对话…

什么是COLLATE排序规则?

在当今数字化世界中,数据的整理、比较和排序是至关重要的。在数据库管理和编程语言中,我们经常需要对字符串进行排序,以展示或处理信息。为了实现这一点,各种系统和工具提供了排序规则,其中COLLATE排序规则就是其中的一…

Linux:信号的保存[2]

1.信号在内核中的表示 因为是三种内核的数据结构,操作系统就可以通过操作这些数据结构提供接口。 如果一个信号没有产生,并不妨碍它可以先被阻塞。 当同一时刻发送大量相同信号时,会丢失。 2.信号的捕捉(重点) 信号产…

顺序表和链表(详解)

线性表 线性表( linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。…

【电脑无法通过鼠标和键盘唤醒应该怎么办】

【电脑无法通过鼠标和键盘唤醒应该怎么办】 方法一(有时候不起作用):方法二(方法一无效时,使用方法二): 方法一(有时候不起作用): 方法二(方法一无效时,使用方法二):

动态规划(路径问题)

62. 不同路径 62. 不同路径 - 力扣(LeetCode) 动态规划思想第一步:描述状态~ dp[i][j]:表示走到i,j位置时,一共有多少种方法~ 动态规划思想第二步:状态转移方程~ 动态规划思想第三步&#xf…

vue + element-ui 组件样式缺失导致没有效果

失效 代码: 修改方法: 在main.js文件里面加上: import element-ui/lib/theme-chalk/index.css; 最后:

Go 切片:用法和本质

要想更好的了解一个知识点,实战是最好的经历。 题目 我这里放一道题目: package mainimport "fmt"func SliceRise(s []int) {s append(s, 0)for i : range s {s[i]}fmt.Println(s) }func SlicePrint() {s1 : []int{1, 2}s2 : s1s2 append…

Spring MVC:设置响应

目录 引言 1. 返回静态页面 1.1 Spring 默认扫描路径 1.2 RestController 1.2.1 Controller > 返回页面 1.2.2 ResponseBody 2. 返回 HTML 2.1 RequestMapping 2.1.1 produces(修改响应的 Content-Type) 2.1.2 其他属性 3. 返回 JSON 4. 设置状态码 4.1 HttpSer…

基于Spark的共享单车数据存储系统的设计与实现_springboot+vue

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

在Unity中使用大模型进行离线语音识别

文章目录 1、Vosk下载下载vosk-untiy-asr下载模型在项目中使用语音转文字音频转文字2、whisper下载下载unity项目下载模型在unity中使用1、Vosk 下载 下载vosk-untiy-asr Github链接:https://github.com/alphacep/vosk-unity-asr 进不去Github的可以用网盘 夸克网盘链接:h…

【计算机网络】- 应用层HTTP协议

目录 初识HTTP 什么是HTTP 版本 HTTPS 模型 HTTP抓包工具 为什么使用 抓包工具的下载 下载后的重要操作 Fiddler的使用 HTTP请求与响应的基本格式 HTTP请求基本格式​编辑 HTTP响应基本格式 协议格式总结❗️❗️❗️​编辑 HTTP 详解 认识 URL URL基本格式 …

记一次IDOR 和访问控制缺失漏洞挖掘

视频教程在我主页简介和专栏里 测试 IDOR(不安全的直接对象引用) 漏洞时,我会使用一系列工具,确保不会遗漏任何问题。以下是我的测试方法: 设置 Firefox 和 Pwnfox: 1、我使用 Firefox 浏览器&#xff0c…

GS论文阅读--Hard Gaussian Splatting

前言 本文也是对高斯点云的分布进行优化的,看! 文章目录 前言1.背景介绍2.关键内容2.1 位置梯度驱动HGS2.2 渲染误差引导HGS 3.文章贡献 1.背景介绍 在训练过程中,它严重依赖于视图空间位置梯度的平均幅度来增长高斯以减少渲染损失。然而&…

JS基础-操作数组(7)

一.增删改查 1.改 重新赋值 2.增 arr.puch() 末尾追加 arr.unshift() 开头追加 a)案例:数组筛选 3.删除 arr.pop() 删除最后一个元素 arr.shift() 删除第一个元素 splice() 删除指定元素

C++otlv4连接sql serveer使用记录(注意点)

C使用otlv4在做插入时,有一些设计的坑需要注意 插入数据: 当要给表中插入单个字符时,数据库表设计使用varchar(1)是合理的,但是otlv4一直报错char。 后续查很久才知道,otlv4所写的绑定的字符数组的长度应该实际数组…