diff --git a/modules/vectorize.py b/modules/vectorize.py index f37b3ab..3aafdc6 100644 --- a/modules/vectorize.py +++ b/modules/vectorize.py @@ -1,5 +1,14 @@ from .utils import runwareUtils as rwUtils import json +import base64 +import io + +class SVGData: + """Wrapper class to match RecraftIO.SVG format for SaveSVGNode""" + def __init__(self, svg_content): + # Convert SVG string to BytesIO + svg_bytes = io.BytesIO(svg_content.encode('utf-8')) + self.data = [svg_bytes] class vectorize: RUNWARE_VECTORIZE_MODELS = { @@ -23,8 +32,8 @@ class vectorize: DESCRIPTION = "Convert images to vector format using Runware's vectorization service." FUNCTION = "vectorizeImage" - RETURN_TYPES = ("IMAGE", "STRING") - RETURN_NAMES = ("IMAGE", "Vector Data") + RETURN_TYPES = ("SVG",) + RETURN_NAMES = ("SVG",) CATEGORY = "Runware" def vectorizeImage(self, **kwargs): @@ -46,6 +55,8 @@ class vectorize: "inputs": { "image": image_uuid }, + "outputType": "base64Data", + "outputFormat": "svg", } ] @@ -69,12 +80,20 @@ class vectorize: if "data" in genResult and len(genResult["data"]) > 0: result_data = genResult["data"][0] - # Return the vectorized image URL - if "imageURL" in result_data: - vector_url = result_data["imageURL"] - return (image, vector_url) + # Check for base64 SVG data + if "imageBase64Data" in result_data: + base64_svg = result_data["imageBase64Data"] + + # Decode base64 SVG to get the actual SVG content for SaveSVGNode + svg_content = base64.b64decode(base64_svg).decode('utf-8') + + # Wrap SVG content in SVGData for SaveSVGNode compatibility + svg_data = SVGData(svg_content) + + # Return only SVG data + return (svg_data,) else: - raise Exception("imageURL not found in response") + raise Exception("imageBase64Data not found in response") else: raise Exception("No data returned from vectorization API") diff --git a/workflows/Runware_Vectorize.json b/workflows/Runware_Vectorize.json index e2deaaf..fb9fa87 100644 --- a/workflows/Runware_Vectorize.json +++ b/workflows/Runware_Vectorize.json @@ -1 +1 @@ -{"id":"993f4b88-acb5-4f70-968f-e3a2c9c1c5b4","revision":0,"last_node_id":5,"last_link_id":5,"nodes":[{"id":3,"type":"SaveImage","pos":[446.1082458496094,502.5049743652344],"size":[270,270.0000305175781],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"images","name":"images","type":"IMAGE","link":5},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.46"},"widgets_values":["ComfyUI"]},{"id":4,"type":"LoadImage","pos":[-162.27017211914062,506.9244384765625],"size":[274.080078125,314.0000305175781],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[4]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadImage"},"widgets_values":["bulldog_1.webp","image"]},{"id":5,"type":"Runware Vectorize","pos":[138.47059631347656,530.4171142578125],"size":[270,78],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"Image","name":"Image","type":"IMAGE","link":4},{"localized_name":"Model","name":"Model","type":"COMBO","widget":{"name":"Model"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[5]},{"localized_name":"Vector Data","name":"Vector Data","type":"STRING","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"1c7da18f11d51514140944e0f9f90e62ae99572c","Node name for S&R":"Runware Vectorize"},"widgets_values":["picsart:1@1"],"bgcolor":"#5345bf"}],"links":[[4,4,0,5,0,"IMAGE"],[5,5,0,3,0,"IMAGE"]],"groups":[],"config":{},"extra":{"ds":{"scale":1.02884607845781,"offset":[636.1817070868053,-324.5220431776123]}},"version":0.4} \ No newline at end of file +{"id":"993f4b88-acb5-4f70-968f-e3a2c9c1c5b4","revision":0,"last_node_id":7,"last_link_id":8,"nodes":[{"id":6,"type":"SaveSVGNode","pos":[447.0441589355469,567.7747192382812],"size":[270,270],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"svg","name":"svg","type":"SVG","link":8},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"SaveSVGNode"},"widgets_values":["svg/ComfyUI"]},{"id":4,"type":"LoadImage","pos":[-162.27017211914062,506.9244384765625],"size":[274.080078125,314.0000305175781],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[7]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadImage"},"widgets_values":["bulldog_1.webp","image"]},{"id":7,"type":"Runware Vectorize","pos":[146.1571044921875,546.4293823242188],"size":[270,58],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"Image","name":"Image","type":"IMAGE","link":7},{"localized_name":"Model","name":"Model","type":"COMBO","widget":{"name":"Model"},"link":null}],"outputs":[{"localized_name":"SVG","name":"SVG","type":"SVG","links":[8]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"8d75a6933feda430268dd0c555ecde9ccd99c7ef","Node name for S&R":"Runware Vectorize"},"widgets_values":["recraft:1@1"],"bgcolor":"#5345bf"}],"links":[[7,4,0,7,0,"IMAGE"],[8,7,0,6,0,"SVG"]],"groups":[],"config":{},"extra":{"ds":{"scale":1.02884607845781,"offset":[476.52544538804847,-345.82928772954745]}},"version":0.4} \ No newline at end of file