Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bff2760c3d | ||
|
|
a0f8848367 | ||
|
|
5b1cbcd8d5 |
+3
-1
@@ -778,12 +778,14 @@ async def start_local_llm(data):
|
||||
|
||||
server_settings=ServerSettings(host=address,port=port)
|
||||
|
||||
name, ext = os.path.splitext(os.path.basename(model))
|
||||
print('#model',name)
|
||||
app = create_app(
|
||||
server_settings=server_settings,
|
||||
model_settings=[
|
||||
ModelSettings(
|
||||
model=model,
|
||||
model_alias=os.path.basename(model),
|
||||
model_alias=name,
|
||||
n_gpu_layers=n_gpu_layers,
|
||||
n_ctx=4098,
|
||||
chat_format=chat_format,
|
||||
|
||||
+7
-5
@@ -591,14 +591,15 @@ def run_briarmbg(images=[]):
|
||||
return (masks,rgba_images,rgb_images)
|
||||
|
||||
|
||||
def run_rembg(model_name= "unet",images=[]):
|
||||
def run_rembg(model_name= "unet",images=[],callback=None):
|
||||
# model_name = "unet" # "isnet-general-use"
|
||||
# print('#run_rembg',model_name)
|
||||
rembg_session = new_session(model_name)
|
||||
masks=[]
|
||||
rgba_images=[]
|
||||
rgb_images=[]
|
||||
# 进度条
|
||||
pbar = comfy.utils.ProgressBar(len(images) )
|
||||
pbar=callback
|
||||
for img in images:
|
||||
# use the post_process_mask argument to post process the mask to get better results.
|
||||
mask = remove(img, session=rembg_session,only_mask=True,post_process_mask=True)
|
||||
@@ -638,8 +639,9 @@ def run_rembg(model_name= "unet",images=[]):
|
||||
rgb_image = Image.new("RGB", image_rgba.size, (0, 0, 0))
|
||||
rgb_image.paste(image_rgba, mask=image_rgba.split()[3])
|
||||
rgb_images.append(rgb_image)
|
||||
|
||||
pbar.update(1)
|
||||
|
||||
if pbar:
|
||||
pbar.update(1)
|
||||
return (masks,rgba_images,rgb_images)
|
||||
|
||||
|
||||
@@ -691,7 +693,7 @@ class RembgNode_:
|
||||
if model_name=='briarmbg':
|
||||
masks,rgba_images,rgb_images=run_briarmbg(images)
|
||||
else:
|
||||
masks,rgba_images,rgb_images=run_rembg(model_name,images)
|
||||
masks,rgba_images,rgb_images=run_rembg(model_name,images, comfy.utils.ProgressBar(len(images) ))
|
||||
|
||||
masks=[pil2tensor(m) for m in masks]
|
||||
|
||||
|
||||
+68
-23
@@ -474,8 +474,7 @@
|
||||
<a class="link" href="https://www.mixcomfy.com" target="_blank">ComfyUI中文爱好者社区推荐</a>
|
||||
</div>
|
||||
|
||||
<a id="login_btn" target="_blank" href="https://discord.gg/xbP2GZF6gn"
|
||||
style="text-decoration: none;
|
||||
<a id="login_btn" target="_blank" href="https://discord.gg/xbP2GZF6gn" style="text-decoration: none;
|
||||
color: black;font-size:12px">
|
||||
<svg height="32" aria-hidden="true" viewBox="0 0 16 16" version="1.1" width="32" data-view-component="true"
|
||||
class="octicon octicon-mark-github v-align-middle color-fg-default">
|
||||
@@ -762,7 +761,6 @@
|
||||
async function editImage(image, data) {
|
||||
//判断mask是否有输出
|
||||
let isMask = data.options.hasMask;
|
||||
console.log(data)
|
||||
|
||||
//app
|
||||
document.body.querySelector('.app').style.display = 'none'
|
||||
@@ -772,6 +770,22 @@
|
||||
editor.style.display = 'block';
|
||||
const iframe = editor.querySelector('iframe');
|
||||
|
||||
const sleep = (t = 1000) => {
|
||||
return new Promise((res, rej) => {
|
||||
setTimeout(() => {
|
||||
res(true)
|
||||
}, t)
|
||||
})
|
||||
}
|
||||
|
||||
//清空 图层
|
||||
const removeAllLayer = () => {
|
||||
let Layers = iframe.contentWindow.Layers;
|
||||
//清空
|
||||
Layers.reset_layers()
|
||||
Layers.refresh_gui()
|
||||
}
|
||||
|
||||
// 复原
|
||||
const resetLayer = () => {
|
||||
let Layers = iframe.contentWindow.Layers;
|
||||
@@ -841,17 +855,19 @@
|
||||
//自动抠图
|
||||
let autoMaskSelect = iframe.contentDocument.getElementById('automask_image_mixlab');
|
||||
const select = iframe.contentDocument.getElementById('automask_models_mixlab');
|
||||
let rembgModels = await get_rembg_models()
|
||||
// 遍历模型列表并创建选项
|
||||
for (const model of rembgModels) {
|
||||
const option = document.createElement('option');
|
||||
option.value = model;
|
||||
option.textContent = model;
|
||||
select.appendChild(option);
|
||||
if (select.children.length === 0) {
|
||||
let rembgModels = await get_rembg_models()
|
||||
// 遍历模型列表并创建选项
|
||||
for (const model of rembgModels) {
|
||||
const option = document.createElement('option');
|
||||
option.value = model;
|
||||
option.textContent = model;
|
||||
select.appendChild(option);
|
||||
}
|
||||
}
|
||||
|
||||
let autoMaskBtn = iframe.contentDocument.getElementById('automask_image_mixlab');
|
||||
autoMaskBtn.addEventListener('click', async e => {
|
||||
if (!autoMaskBtn.getAttribute('init')) autoMaskBtn.addEventListener('click', async e => {
|
||||
//api请求
|
||||
let base64 = getImageBase64FromLayer()
|
||||
resetLayer()
|
||||
@@ -866,16 +882,19 @@
|
||||
|
||||
let mb = convertImageToBlackBasedOnAlpha(image)
|
||||
let mask = await createImage(mb)
|
||||
addImage((Layers.get_layers()).length, 'Mask_' + data.id, mask)
|
||||
let id = Layers.auto_increment;
|
||||
addImage(id, 'Mask_' + data.id + id, mask)
|
||||
})
|
||||
|
||||
|
||||
autoMaskBtn.setAttribute('init', 1)
|
||||
let cancelImageBtn = iframe.contentDocument.getElementById('cancel_image_mixlab');
|
||||
cancelImageBtn.addEventListener('click', e => {
|
||||
if (!cancelImageBtn.getAttribute('init')) cancelImageBtn.addEventListener('click', e => {
|
||||
editor.style.display = 'none';
|
||||
document.body.querySelector('.app').style.display = 'flex'
|
||||
document.body.querySelector('#author').style.display = 'block'
|
||||
})
|
||||
|
||||
cancelImageBtn.setAttribute('init', 1)
|
||||
// 获取 id 为 "mix" 的 button 元素
|
||||
let saveImageBtn = iframe.contentDocument.getElementById('save_image_mixlab');
|
||||
saveImageBtn.style = `width: 98px;
|
||||
@@ -883,7 +902,7 @@
|
||||
margin: 0 12px;
|
||||
background-color: var(--background-color-active);
|
||||
color: var(--text-color-active);`
|
||||
saveImageBtn.addEventListener('click', async e => {
|
||||
if (!saveImageBtn.getAttribute('init')) saveImageBtn.addEventListener('click', async e => {
|
||||
//保存,并更新图片
|
||||
e.preventDefault();
|
||||
|
||||
@@ -973,22 +992,32 @@
|
||||
document.body.querySelector('#author').style.display = 'block'
|
||||
})
|
||||
|
||||
saveImageBtn.setAttribute('init', 1)
|
||||
|
||||
var Layers = iframe.contentWindow.Layers;
|
||||
// console.log(Layers)
|
||||
|
||||
//判断是否已经存在
|
||||
let layers1 = Layers.get_layers()
|
||||
let layers1 = Layers.get_layers();
|
||||
|
||||
//通过layer.link.src 判断是否图片更新
|
||||
console.log(layers1.filter(l => l.name == 'Image_' + data.id)[0]?.link?.currentSrc !== image.src)
|
||||
if (layers1.filter(l => l.name == 'Image_' + data.id)[0]
|
||||
&& layers1.filter(l => l.name == 'Image_' + data.id)[0].link.src !== image.src) {
|
||||
//清空图层
|
||||
removeAllLayer();
|
||||
layers1 = [];
|
||||
await sleep()
|
||||
}
|
||||
console.log(layers1, layers1.length)
|
||||
if (!layers1.filter(l => l.name == 'Image_' + data.id)[0]) {
|
||||
addImage((Layers.get_layers()).length, 'Image_' + data.id, image)
|
||||
addImage(0, 'Image_' + data.id, image)
|
||||
}
|
||||
|
||||
if (isMask) {
|
||||
if (!layers1.filter(l => l.name == 'Mask_' + data.id)[0]) {
|
||||
addMask((Layers.get_layers()).length, 'Mask_' + data.id, image)
|
||||
addMask(1, 'Mask_' + data.id, image)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1437,8 +1466,9 @@
|
||||
|
||||
if (hashId == window._appData.data[data.id].hashId) return
|
||||
|
||||
let base64 = await blobToBase64(fileBlob)
|
||||
|
||||
if (data.class_type === 'LoadImagesToBatch') {
|
||||
let base64 = await blobToBase64(fileBlob)
|
||||
createBase64ImageForLoadImageToBatch(imageElement, data.id, base64)
|
||||
} else {
|
||||
let { url, name } = await uploadImage(fileBlob);
|
||||
@@ -1447,6 +1477,14 @@
|
||||
window._appData.data[data.id].inputs.image = name;
|
||||
window._appData.data[data.id].hashId = hashId;
|
||||
console.log("上传的文件:", url, data.id, name);
|
||||
|
||||
//更换option里的default image
|
||||
window._appData.input = Array.from(window._appData.input, inp => {
|
||||
if (inp.id === data.id) {
|
||||
inp.options.defaultImage = base64;
|
||||
}
|
||||
return inp
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1748,9 +1786,9 @@
|
||||
//上传,返回url
|
||||
let { url, name } = await uploadImage(fileBlob, '.' + file.type.split('/')[1])
|
||||
|
||||
let base64 = await parseImageToBase64(url);
|
||||
|
||||
if (data.class_type === 'ImagesPrompt_') {
|
||||
//
|
||||
let base64 = await parseImageToBase64(url);
|
||||
uploadContainer.querySelector('.images_prompt_main').src = base64
|
||||
window._appData.data[data.id].inputs.image_base64 = base64;
|
||||
} else {
|
||||
@@ -1760,10 +1798,17 @@
|
||||
// 在这里可以对 Blob 对象进行进一步处理
|
||||
imageElement.src = url;
|
||||
|
||||
|
||||
if (isVideoUpload) {
|
||||
window._appData.data[data.id].inputs.video = name;
|
||||
} else {
|
||||
//更换option里的default image
|
||||
window._appData.input = Array.from(window._appData.input, inp => {
|
||||
if (inp.id === data.id) {
|
||||
inp.options.defaultImage = base64;
|
||||
}
|
||||
return inp
|
||||
})
|
||||
|
||||
window._appData.data[data.id].inputs.image = name;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import { app } from '../../../scripts/app.js'
|
||||
const repoOwner = 'shadowcz007' // 替换为仓库的所有者
|
||||
const repoName = 'comfyui-mixlab-nodes' // 替换为仓库的名称
|
||||
|
||||
const version = 'v0.28.0'
|
||||
const version = 'v0.28.1'
|
||||
|
||||
fetch(`https://api.github.com/repos/${repoOwner}/${repoName}/releases/latest`)
|
||||
.then(response => response.json())
|
||||
|
||||
Reference in New Issue
Block a user