From 90638f62833af193130f37a2c4a1b0d99321becd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E9=9B=AA=E5=B3=B0?= Date: Tue, 26 Dec 2023 17:50:42 +0800 Subject: [PATCH] copy api json --- easyapi/ImageNode.py | 33 +++++++++++++++++++++++++++++++++ static/js/workflows.js | 20 ++++++++++++++++++-- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/easyapi/ImageNode.py b/easyapi/ImageNode.py index 9374b0f..0b6a200 100644 --- a/easyapi/ImageNode.py +++ b/easyapi/ImageNode.py @@ -143,10 +143,41 @@ class MaskToBase64Image(MaskImageToBase64): FUNCTION = "mask_to_base64image" def mask_to_base64image(self, mask): + """将一个二维的掩码张量扩展为一个四维的彩色图像张量。具体的步骤如下: + + 第一行,使用 torch.reshape 函数,将掩码张量的形状改变为(-1, 1, mask.shape[-2], mask.shape[-1]), + 其中 - 1 表示自动推断该维度的大小,1 表示增加一个新的维度,mask.shape[-2] 和 mask.shape[-1] 表示保持原来的最后两个维度不变。 + 这样,掩码张量就变成了一个四维的张量,其中第二个维度只有一个通道。 + + 第二行,使用 torch.movedim 函数,将掩码张量的第二个维度(通道维度)移动到最后一个维度的位置,即将形状为(-1, 1, mask.shape[-2], mask.shape[-1]) + 的张量变为(-1, mask.shape[-2], mask.shape[-1], 1) 的张量。这样,掩码张量就变成了一个符合图像格式的张量,其中最后一个维度表示通道数。 + + 第三行,使用 torch.Tensor.expand 函数,将掩码张量的最后一个维度(通道维度)扩展为 3,即将形状为(-1, mask.shape[-2], mask.shape[-1], 1) 的张量变为(-1, mask.shape[-2], mask.shape[-1], 3) 的张量。这样,掩码张量就变成了一个彩色图像张量,其中最后一个维度表示红、绿、蓝三个通道。 + + 这段代码的结果是一个与原来的掩码张量相同元素的彩色图像张量,表示掩码的颜色 + """ images = mask.reshape((-1, 1, mask.shape[-2], mask.shape[-1])).movedim(1, -1).expand(-1, -1, -1, 3) return super().convert(images) +class MaskToBase64(MaskImageToBase64): + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "mask": ("MASK",), + } + } + + CATEGORY = "EasyApi/Image" + + RETURN_TYPES = ("STRING",) + FUNCTION = "mask_to_base64image" + + def mask_to_base64image(self, mask): + return super().convert(mask) + + class LoadImageToBase64(LoadImage): RETURN_TYPES = ("STRING", "IMAGE", "MASK", ) RETURN_NAMES = ("base64Images", "IMAGE", "MASK", ) @@ -196,6 +227,7 @@ def base64_to_image(base64_string): NODE_CLASS_MAPPINGS = { "Base64ToImage": Base64ToImage, "ImageToBase64": ImageToBase64, + # "MaskToBase64": MaskToBase64, "ImageToBase64Advanced": ImageToBase64Advanced, "MaskToBase64Image": MaskToBase64Image, "MaskImageToBase64": MaskImageToBase64, @@ -206,6 +238,7 @@ NODE_CLASS_MAPPINGS = { NODE_DISPLAY_NAME_MAPPINGS = { "Base64ToImage": "Base64 To Image", "ImageToBase64": "Image To Base64", + # "MaskToBase64": "Mask To Base64", "ImageToBase64Advanced": "Image To Base64 (Advanced)", "MaskToBase64Image": "Mask To Base64 Image", "MaskImageToBase64": "Mask Image To Base64", diff --git a/static/js/workflows.js b/static/js/workflows.js index bfe8c32..716fac8 100644 --- a/static/js/workflows.js +++ b/static/js/workflows.js @@ -74,6 +74,11 @@ class EasyApiWorkflows { document.body.removeChild(textarea); } } + + function showTip(tips) { + app.ui.dialog.show(tips); + setTimeout(() => app.ui.dialog.close(), 500); + } function addWorkflowMenu(type, getOptions) { return $el("div.easyapi-workflow-arrow", { parent: document.getElementById(`comfy-${type}-button`), @@ -103,6 +108,17 @@ class EasyApiWorkflows { orgSaveApiBtn.click(); }, }, + { + title: "Copy Api", + callback: async () => { + app.graphToPrompt().then(p => { + const apiObj = p.output; + const json = JSON.stringify(apiObj, null, null); + copyToClipboard(json); + showTip("Copied") + }); + }, + }, { title: "Save EasyApi as", callback: async () => { @@ -141,7 +157,7 @@ class EasyApiWorkflows { const newApiObj = replaceImageNode(apiObj) const json = JSON.stringify(newApiObj, null, null); // convert the data to a JSON string copyToClipboard(json); - alert("Copied") + showTip("Copied") }); }, }, @@ -155,7 +171,7 @@ class EasyApiWorkflows { app.graphToPrompt().then(p => { const json = JSON.stringify(app.graph.serialize(), null, null); // convert the data to a JSON string copyToClipboard(json); - alert("Copied") + showTip("Copied") }); }, },