mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-01-10 14:20:49 +08:00
To reduce bandwidth traffic in a remote environment, a lossy compression-based preview mode is provided for displaying simple visualizations in node-based widgets.
* Added 'preview=[image format]' option to the '/view' API. * Updated node to use preview for displaying images as widgets. * Excluded preview usage in the open image, save image, mask editor where the original data is required.
This commit is contained in:
parent
700491d81a
commit
c78e6a58c0
10
server.py
10
server.py
@ -217,6 +217,16 @@ class PromptServer():
|
|||||||
file = os.path.join(output_dir, filename)
|
file = os.path.join(output_dir, filename)
|
||||||
|
|
||||||
if os.path.isfile(file):
|
if os.path.isfile(file):
|
||||||
|
if 'preview' in request.rel_url.query:
|
||||||
|
with Image.open(file) as img:
|
||||||
|
img = img.convert("RGB") # jpeg doesn't support RGBA
|
||||||
|
buffer = BytesIO()
|
||||||
|
img.save(buffer, format=request.rel_url.query['preview'], optimize=True, quality=90)
|
||||||
|
buffer.seek(0)
|
||||||
|
|
||||||
|
return web.Response(body=buffer.read(), content_type=f'image/{request.rel_url.query}',
|
||||||
|
headers={"Content-Disposition": f"filename=\"{filename}\""})
|
||||||
|
|
||||||
if 'channel' not in request.rel_url.query:
|
if 'channel' not in request.rel_url.query:
|
||||||
channel = 'rgba'
|
channel = 'rgba'
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -41,7 +41,7 @@ async function uploadMask(filepath, formData) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
ComfyApp.clipspace.imgs[ComfyApp.clipspace['selectedIndex']] = new Image();
|
ComfyApp.clipspace.imgs[ComfyApp.clipspace['selectedIndex']] = new Image();
|
||||||
ComfyApp.clipspace.imgs[ComfyApp.clipspace['selectedIndex']].src = "/view?" + new URLSearchParams(filepath).toString();
|
ComfyApp.clipspace.imgs[ComfyApp.clipspace['selectedIndex']].src = "/view?" + new URLSearchParams(filepath).toString() + "&preview=jpeg";
|
||||||
|
|
||||||
if(ComfyApp.clipspace.images)
|
if(ComfyApp.clipspace.images)
|
||||||
ComfyApp.clipspace.images[ComfyApp.clipspace['selectedIndex']] = filepath;
|
ComfyApp.clipspace.images[ComfyApp.clipspace['selectedIndex']] = filepath;
|
||||||
@ -335,6 +335,7 @@ class MaskEditorDialog extends ComfyDialog {
|
|||||||
|
|
||||||
const alpha_url = new URL(ComfyApp.clipspace.imgs[ComfyApp.clipspace['selectedIndex']].src)
|
const alpha_url = new URL(ComfyApp.clipspace.imgs[ComfyApp.clipspace['selectedIndex']].src)
|
||||||
alpha_url.searchParams.delete('channel');
|
alpha_url.searchParams.delete('channel');
|
||||||
|
alpha_url.searchParams.delete('preview');
|
||||||
alpha_url.searchParams.set('channel', 'a');
|
alpha_url.searchParams.set('channel', 'a');
|
||||||
touched_image.src = alpha_url;
|
touched_image.src = alpha_url;
|
||||||
|
|
||||||
@ -345,6 +346,7 @@ class MaskEditorDialog extends ComfyDialog {
|
|||||||
|
|
||||||
const rgb_url = new URL(ComfyApp.clipspace.imgs[ComfyApp.clipspace['selectedIndex']].src);
|
const rgb_url = new URL(ComfyApp.clipspace.imgs[ComfyApp.clipspace['selectedIndex']].src);
|
||||||
rgb_url.searchParams.delete('channel');
|
rgb_url.searchParams.delete('channel');
|
||||||
|
rgb_url.searchParams.delete('preview');
|
||||||
rgb_url.searchParams.set('channel', 'rgb');
|
rgb_url.searchParams.set('channel', 'rgb');
|
||||||
orig_image.src = rgb_url;
|
orig_image.src = rgb_url;
|
||||||
this.image = orig_image;
|
this.image = orig_image;
|
||||||
|
|||||||
@ -231,14 +231,20 @@ export class ComfyApp {
|
|||||||
options.unshift(
|
options.unshift(
|
||||||
{
|
{
|
||||||
content: "Open Image",
|
content: "Open Image",
|
||||||
callback: () => window.open(img.src, "_blank"),
|
callback: () => {
|
||||||
|
let url = new URL(img.src);
|
||||||
|
url.searchParams.delete('preview');
|
||||||
|
window.open(url, "_blank")
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
content: "Save Image",
|
content: "Save Image",
|
||||||
callback: () => {
|
callback: () => {
|
||||||
const a = document.createElement("a");
|
const a = document.createElement("a");
|
||||||
a.href = img.src;
|
let url = new URL(img.src);
|
||||||
a.setAttribute("download", new URLSearchParams(new URL(img.src).search).get("filename"));
|
url.searchParams.delete('preview');
|
||||||
|
a.href = url;
|
||||||
|
a.setAttribute("download", new URLSearchParams(url.search).get("filename"));
|
||||||
document.body.append(a);
|
document.body.append(a);
|
||||||
a.click();
|
a.click();
|
||||||
requestAnimationFrame(() => a.remove());
|
requestAnimationFrame(() => a.remove());
|
||||||
@ -365,7 +371,7 @@ export class ComfyApp {
|
|||||||
const img = new Image();
|
const img = new Image();
|
||||||
img.onload = () => r(img);
|
img.onload = () => r(img);
|
||||||
img.onerror = () => r(null);
|
img.onerror = () => r(null);
|
||||||
img.src = "/view?" + new URLSearchParams(src).toString();
|
img.src = "/view?" + new URLSearchParams(src).toString() + "&preview=jpeg";
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
).then((imgs) => {
|
).then((imgs) => {
|
||||||
|
|||||||
@ -303,7 +303,7 @@ export const ComfyWidgets = {
|
|||||||
subfolder = name.substring(0, folder_separator);
|
subfolder = name.substring(0, folder_separator);
|
||||||
name = name.substring(folder_separator + 1);
|
name = name.substring(folder_separator + 1);
|
||||||
}
|
}
|
||||||
img.src = `/view?filename=${name}&type=input&subfolder=${subfolder}`;
|
img.src = `/view?filename=${name}&type=input&subfolder=${subfolder}&preview=jpeg`;
|
||||||
node.setSizeForImage?.();
|
node.setSizeForImage?.();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user