Files
2024-05-15 08:09:49 +08:00

3.2 KiB

Documentation

LoadImage节点旨在从指定目录中摄取图像文件,处理它们,并输出图像及其对应的掩码。它能够处理图像序列并将其转换为适合进一步处理的格式,强调其在准备图像相关任务数据中的作用。

Input types

Required

  • image
    • 'image'参数是要处理的图像文件的路径。它对节点的操作至关重要,因为它决定了要加载和操作的特定图像。
    • Comfy dtype: str
    • Python dtype: str

Output types

  • IMAGE
    • 'IMAGE'输出是一个表示处理后的图像数据的张量,它已被转换为浮点格式并进行了归一化。这个输出很重要,因为它是用于后续图像分析或操作任务的主要数据结构。
    • Comfy dtype: torch.Tensor
    • Python dtype: torch.Tensor
  • MASK
    • 'MASK'输出是一个表示与图像相关联的二进制掩码的张量,用于区分图像中的不同区域或对象。对于需要分割或对象识别的任务来说,它是必不可少的。
    • Comfy dtype: torch.Tensor
    • Python dtype: torch.Tensor

Usage tips

  • Infra type: CPU

Source code

class LoadImage:

    @classmethod
    def INPUT_TYPES(s):
        input_dir = folder_paths.get_input_directory()
        files = [f for f in os.listdir(input_dir) if os.path.isfile(os.path.join(input_dir, f))]
        return {'required': {'image': (sorted(files), {'image_upload': True})}}
    CATEGORY = 'image'
    RETURN_TYPES = ('IMAGE', 'MASK')
    FUNCTION = 'load_image'

    def load_image(self, image):
        image_path = folder_paths.get_annotated_filepath(image)
        img = Image.open(image_path)
        output_images = []
        output_masks = []
        for i in ImageSequence.Iterator(img):
            i = ImageOps.exif_transpose(i)
            if i.mode == 'I':
                i = i.point(lambda i: i * (1 / 255))
            image = i.convert('RGB')
            image = np.array(image).astype(np.float32) / 255.0
            image = torch.from_numpy(image)[None,]
            if 'A' in i.getbands():
                mask = np.array(i.getchannel('A')).astype(np.float32) / 255.0
                mask = 1.0 - torch.from_numpy(mask)
            else:
                mask = torch.zeros((64, 64), dtype=torch.float32, device='cpu')
            output_images.append(image)
            output_masks.append(mask.unsqueeze(0))
        if len(output_images) > 1:
            output_image = torch.cat(output_images, dim=0)
            output_mask = torch.cat(output_masks, dim=0)
        else:
            output_image = output_images[0]
            output_mask = output_masks[0]
        return (output_image, output_mask)

    @classmethod
    def IS_CHANGED(s, image):
        image_path = folder_paths.get_annotated_filepath(image)
        m = hashlib.sha256()
        with open(image_path, 'rb') as f:
            m.update(f.read())
        return m.digest().hex()

    @classmethod
    def VALIDATE_INPUTS(s, image):
        if not folder_paths.exists_annotated_filepath(image):
            return 'Invalid image file: {}'.format(image)
        return True