├── .github └── workflows │ └── publish.yml ├── README.md ├── __init__.py ├── nodes.py └── pyproject.toml /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish to Comfy registry 2 | on: 3 | workflow_dispatch: 4 | push: 5 | branches: 6 | - main 7 | - master 8 | paths: 9 | - "pyproject.toml" 10 | 11 | jobs: 12 | publish-node: 13 | name: Publish Custom Node to registry 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Check out code 17 | uses: actions/checkout@v4 18 | - name: Publish Custom Node 19 | uses: Comfy-Org/publish-node-action@main 20 | with: 21 | ## Add your own personal access token to your Github Repository secrets and reference it here. 22 | personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ComfyUI Node: Base64 To Image 2 | Loads an image and its transparency mask from a base64-encoded data URI. This is useful for API connections as you can transfer data directly rather than specify a file location. 3 | 4 | ![image](https://github.com/glowcone/comfyui-base64-to-image/assets/7038806/d8b1979d-79ad-400e-8fa6-06296f5447f1) 5 | 6 | You can test with the following image: 7 | 8 | ![Frame 279 (1)](https://github.com/glowcone/comfyui-base64-to-image/assets/7038806/16ba7b24-26eb-4ab5-aebf-c026b5301378) 9 | 10 | The data URI is: 11 | ``` 12 | iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABvElEQVQ4EaXBQWoTYQCG4febRLpN14JOahWmiCZdCd2IFxAvYDInsJ6gR7B4gYwn8AgVpAtFnIq104boZKAguLDdVUr6f05olVJm1+cR1yQu/NrzCwWeAj3MogFRE5eZf4ws3onaz28eCQaAgCMHXkdmJ4hjLhMxMKImgU2qw10PJEaAED4VS91EUxoc7jqTGCAMVDdX1FW151zQY05ktxKlNChzx60FcqBjIATS7n1lKgsbMCAg7SbKaDDZ9TCKGFGTOAJWu4mm+r7v34ZFGzAv765okwbjwqUgFmBzPBP9JNFU47FfhcC6hIOp/pzQ7/d1zBVF4TiKeAs8tBGiPAk8UVE4dsQW4jYGw5fTwLN+oilX5KU7C6fkNrEEwWyKWlE4nrXJHegg5soH97REg68H3kBs2EiiFLW8cEybHNNhLmLYX9YbGuRjD4ERF0Tt08QDTCZhQxVFPF5dUkWDjwfOWi2e2wjYEbUPE5dATM0ie3RHKQ22x+7diPhsELUAqbYnHkqMuBAihp5Rtdr4bIZabRzOiDG9SKwzJ7DJ1paV6v0Pb8nEgXMREPhPzAljzpmqBdnasjJq4pr+AuEWzU4x7NF4AAAAAElFTkSuQmCC 13 | ``` 14 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS 2 | __all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS'] 3 | -------------------------------------------------------------------------------- /nodes.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | 4 | import cv2 5 | from PIL import Image, ImageOps 6 | import folder_paths 7 | import torch 8 | import numpy as np 9 | from io import BytesIO 10 | import base64 11 | 12 | 13 | class LoadImageFromBase64: 14 | @classmethod 15 | def INPUT_TYPES(s): 16 | return { 17 | "required": { 18 | "data": ("STRING", {"default": ""}), 19 | } 20 | } 21 | 22 | RETURN_TYPES = ("IMAGE", "MASK") 23 | FUNCTION = "load_image" 24 | CATEGORY = "image" 25 | 26 | def convert_color(self, image): 27 | if len(image.shape) > 2 and image.shape[2] >= 4: 28 | return cv2.cvtColor(image, cv2.COLOR_BGRA2RGB) 29 | return cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 30 | 31 | 32 | def load_image(self, data): 33 | nparr = np.frombuffer(base64.b64decode(data), np.uint8) 34 | 35 | result = cv2.imdecode(nparr, cv2.IMREAD_UNCHANGED) 36 | channels = cv2.split(result) 37 | if len(channels) > 3: 38 | mask = channels[3].astype(np.float32) / 255.0 39 | mask = torch.from_numpy(mask) 40 | else: 41 | mask = torch.ones(channels[0].shape, dtype=torch.float32, device="cpu") 42 | 43 | result = self.convert_color(result) 44 | result = result.astype(np.float32) / 255.0 45 | image = torch.from_numpy(result)[None,] 46 | return image, mask.unsqueeze(0) 47 | 48 | 49 | NODE_CLASS_MAPPINGS = { 50 | "LoadImageFromBase64": LoadImageFromBase64, 51 | } 52 | 53 | NODE_DISPLAY_NAME_MAPPINGS = { 54 | "LoadImageFromBase64": "Load Image From Base64", 55 | } 56 | 57 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "comfyui-base64-to-image" 3 | description = "Nodes: LoadImageFromBase64. Loads an image and its transparency mask from a base64-encoded data URI for easy API connection." 4 | version = "1.0.0" 5 | license = "LICENSE" 6 | 7 | [project.urls] 8 | Repository = "https://github.com/glowcone/comfyui-base64-to-image" 9 | # Used by Comfy Registry https://comfyregistry.org 10 | 11 | [tool.comfy] 12 | PublisherId = "glowcone" 13 | DisplayName = "comfyui-base64-to-image" 14 | Icon = "" 15 | --------------------------------------------------------------------------------