Files
CavinHuang-comfyui-nodes-docs/docs/SaltCropImageLocation.md
2024-07-04 08:39:03 +08:00

4.4 KiB

Documentation

  • Class name: SaltCropImageLocation
  • Category: SALT/Image/Process
  • Output node: False

本节点旨在根据指定位置裁剪图像,实现对图像数据集的精确调整和修改。它专注于增强或隔离图像中的特定区域,以便进行进一步处理或分析。

Input types

Required

  • images
    • 要裁剪的图像集合。该参数是节点操作的核心,它决定了将根据提供的尺寸进行裁剪的具体图像。
    • Comfy dtype: IMAGE
    • Python dtype: List[Image]
  • top
    • 指定裁剪区域的上边界。调整此值可以改变裁剪的垂直起点,从而对裁剪区域进行精细控制。
    • Comfy dtype: INT
    • Python dtype: int
  • left
    • 定义裁剪区域的左边界。该参数允许精确控制裁剪的水平位置,影响保留的图像区域。
    • Comfy dtype: INT
    • Python dtype: int
  • right
    • 设置裁剪区域的右边界,决定裁剪区域的水平范围。这个值影响最终裁剪图像的宽度。
    • Comfy dtype: INT
    • Python dtype: int
  • bottom
    • 指示裁剪区域的下边界。该参数影响裁剪的垂直范围,控制裁剪图像的高度。
    • Comfy dtype: INT
    • Python dtype: int

Optional

  • crop_data_batch
    • 可选的裁剪数据批次,用于为一组图像指定多个裁剪区域。该参数支持对具有不同裁剪规格的图像进行批处理。
    • Comfy dtype: CROP_DATA_BATCH
    • Python dtype: Optional[List[Tuple[int, int, int, int]]]

Output types

  • images
    • 裁剪操作后的结果图像。这个输出对于裁剪区域的进一步处理或分析至关重要。
    • Comfy dtype: IMAGE
    • Python dtype: List[Image]
  • crop_data_batch
    • 对应于处理后图像的裁剪数据批次。这个输出提供了应用于每张图像的裁剪区域的详细信息,便于进行进一步的操作或分析。
    • Comfy dtype: CROP_DATA_BATCH
    • Python dtype: List[Tuple[int, int, int, int]]

Usage tips

  • Infra type: CPU
  • Common nodes: unknown

Source code

class SaltCropImageLocation:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "images": ("IMAGE",),
                "top": ("INT", {"default":0, "max": 10000000, "min":0, "step":1}),
                "left": ("INT", {"default":0, "max": 10000000, "min":0, "step":1}),
                "right": ("INT", {"default":256, "max": 10000000, "min":0, "step":1}),
                "bottom": ("INT", {"default":256, "max": 10000000, "min":0, "step":1}),
            },
            "optional": {
                "crop_data_batch": ("CROP_DATA_BATCH",)
            }
        }
    
    RETURN_TYPES = ("IMAGE", "CROP_DATA_BATCH")
    RETURN_NAMES = ("images", "crop_data_batch")

    FUNCTION = "crop"
    CATEGORY = f"{NAME}/Image/Process"

    def crop(self, images, top=0, left=0, right=256, bottom=256, crop_data_batch=None):
        cropped_images = []
        crop_data_list = []
        master_size = None
        
        for i, image in enumerate(images):
            image = tensor2pil(image)
            img_width, img_height = image.size

            if crop_data_batch is not None:
                if len(crop_data_batch) >= i:
                    crop_size, (crop_left, crop_top, crop_right, crop_bottom) = crop_data_batch[i]
                else:
                    cropped_images.append(pil2tensor(image))
                    crop_data_list.append((image.size, (0, 0, image.size[0], image.size[1])))
                    continue
            else:
                crop_top = max(top, 0)
                crop_left = max(left, 0)
                crop_bottom = min(bottom, img_height)
                crop_right = min(right, img_width)

            crop_width = crop_right - crop_left
            crop_height = crop_bottom - crop_top

            if crop_width <= 0 or crop_height <= 0:
                raise ValueError("Invalid crop dimensions.")
            
            crop = image.crop((crop_left, crop_top, crop_right, crop_bottom))
            crop_data = (crop.size, (crop_left, crop_top, crop_right, crop_bottom))
            if not master_size:
                master_size = (((crop.size[0] // 8) * 8), ((crop.size[1] // 8) * 8))
            crop = crop.resize(master_size)
            
            cropped_images.append(pil2tensor(crop))
            crop_data_list.append(crop_data)
        
        cropped_images_batch = torch.cat(cropped_images, dim=0)
        return (cropped_images_batch, crop_data_list)