Comfyui api图生图

一、comfyui添加图片上传节点

需要两个文件,

允许上传base64格式的图片和url格式的图片


 

init.py

from .image_load import LoadImageFromURLOrBase64, LoadMaskFromURLOrBase64

NODE_CLASS_MAPPINGS = {"Load Image From URL/Base64": LoadImageFromURLOrBase64, 
                       "Load Mask From URL/Base64": LoadMaskFromURLOrBase64,
                       #"Save Image As Base64": SaveImageBase64,
                       #"Save Temp Image As Jpeg": SaveTempImageJpeg
                       }
__all__ = ['NODE_CLASS_MAPPINGS']

image_loag.py

import base64
import random
import numpy as np
import torch
import requests
import json
import folder_paths
import os
# import piexif

from PIL import Image, JpegImagePlugin, ImageOps
from io import BytesIO

class LoadImageFromURLOrBase64:   
    @classmethod
    def INPUT_TYPES(s):
        return {"required": {
            "image": ("STRING",{"default": "https://aiiiinimg.oss-cn-shenzhen.aliyuncs.com/AiImages/2024-03-29/1e6d03aa68b34612961d8e0b695c94bd.jpeg"}),
        }}
    
    CATEGORY = "image"
    
    RETURN_TYPES = ("IMAGE",)
    FUNCTION = "load_image"
    def load_image(self, image):        
        if image.startswith(('http://', 'https://')):
            response = requests.get(image)
            img = Image.open(BytesIO(response.content))
        elif image.startswith('data:image/'):  
            _, base64_str = image.split(',', 1) 
            img = Image.open(BytesIO(base64.b64decode(base64_str)))
        else: 
            img = Image.open(BytesIO(base64.b64decode(image)))
        img = ImageOps.exif_transpose(img)
        if img.mode == 'I':
            img = img.point(lambda i: i * (1 / 255))
        img = img.convert("RGB")
        image = np.array(img).astype(np.float32) / 255.0
        image_tensor = torch.from_numpy(image)[None,]
        
        return (image_tensor,)
    
class LoadMaskFromURLOrBase64:
    @classmethod
    def INPUT_TYPES(s):
        return {"required": {
            "image": ("STRING",{"default": "https://aiiiinimg.oss-cn-shenzhen.aliyuncs.com/AiImages/2024-03-29/1e6d03aa68b34612961d8e0b695c94bd.jpeg"}),
        }}
    
    CATEGORY = "mask"

    RETURN_TYPES = ("MASK",)
    FUNCTION = "load_mask"
    def load_mask(self, image):
        if image.startswith(('http://', 'https://')):
            response = requests.get(image)
            img = Image.open(BytesIO(response.content))
        elif image.startswith('data:image/'):  
            _, base64_str = image.split(',', 1) 
            img = Image.open(BytesIO(base64.b64decode(base64_str)))
        else: 
            img = Image.open(BytesIO(base64.b64decode(image)))
        img = img.convert("L")
        mask = np.array(img).astype(np.float32)
        mask = np.where(mask > 127, 1, 0).astype(np.float32)
        mask_tensor = torch.from_numpy(mask)[None, None, ]
        return (mask_tensor,)

二、重启comfyui

三、修改api.py router.py   index.html

api.py


# 图生图
class ImgToImgModel(BaseModel):
    image: str
    prompt: str

@app.post("/imgGenerateImg", tags=["perfume bottle"])
async def imgGenerateImg(data:ImgToImgModel):
    return await process_imggenerateimg(data)

# 将 static 目录中的文件作为静态文件提供
app.mount("/static", StaticFiles(directory="demo/static"), name="static")

router.py

async def process_imggenerateimg(data):
    client_id = str(uuid.uuid4()) 
    prompt = load_json_template('demo/jsonFile/img2img_api.json')
    prompt["3"]["inputs"]["seed"] = random.randrange(10**14, 10**15)
  
    prompt["6"]["inputs"]["text"] = data.prompt 
    prompt["12"]["inputs"]["image"] = data.image
    images =await get_outputs(client_id,prompt)
    return images

index.html

 <h1>Upload Image and Enter Keyword</h1>
    <input type="file" id="imageInput" accept="image/*"><br><br>
    <input type="text" id="keywordInput" placeholder="Enter keyword"><br><br>
    <button id="submitButton" onclick="handleSubmit()">Submit</button>

    <div id="uploadedImageContainer">
        <h3>Uploaded Image:</h3>
        <img id="uploadedImage" src="" alt="Uploaded Image">
    </div>
    <div id="returnedImageContainer">
        <h3>Returned Image:</h3>
        <img id="returnedImage" src="" alt="Returned Image">
    </div>
 // 图生图
    document.getElementById('uploadedImageContainer').style.display = 'none';
        document.getElementById('returnedImageContainer').style.display = 'none';

        async  function getBase64(file) {
            return new Promise((resolve, reject) => {
                const reader = new FileReader();
                reader.readAsDataURL(file);
                reader.onload = () => resolve(reader.result);
                // reader.onload = () => {
                //     // Remove the data:image/jpeg;base64, part
                //     const base64String = reader.result.replace(/^data:image\/jpeg;base64,/, '');
                //     resolve(base64String);
                // };
                reader.onerror = error => reject(error);
            });
        }

    async function handleSubmit() {
        const imageInput = document.getElementById('imageInput');
        const keywordInput = document.getElementById('keywordInput');
        const uploadedImage = document.getElementById('uploadedImage');
        const returnedImage = document.getElementById('returnedImage');
        const uploadedImageContainer = document.getElementById('uploadedImageContainer');
        const returnedImageContainer = document.getElementById('returnedImageContainer');

        if (!imageInput.files.length || !keywordInput.value) {
            alert('Please upload an image and enter a keyword.');
            return;
        }

        const file = imageInput.files[0];
        const base64Image = await getBase64(file);
        // console.log(file)
        // console.log(base64Image)
        uploadedImage.src = base64Image;
        // uploadedImage.src = `data:image/jpeg;base64,${base64Image}`;
        uploadedImageContainer.style.display = 'block';

        const requestData = {
            image: base64Image,
            prompt: keywordInput.value
        };

        try {
            const response = await fetch('/imgGenerateImg', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(requestData)
            });

            if (response.ok) {

                const data = await response.json();
                console.log(response)
                console.log(data)

                // that.image1 = "data:image/png;base64,"+response.data.images;
                returnedImage.src = "data:image/png;base64,"+data.images[0];
                returnedImageContainer.style.display = 'block';
            } else {
                console.error('Error:', response.statusText);
            }
        } catch (error) {
            console.error('Error:', error);
        }
    }

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值