Files
CavinHuang-comfyui-nodes-docs/docs/LayerColor%3A Levels.md
2024-06-12 08:44:19 +08:00

4.5 KiB

Documentation

改变图像色阶。

Input types

Required

  • image

    • 输入的图片。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • channel

    • 选择要调整的通道。有RGB, red, green, blue可供选择。
    • Comfy dtype: STRING
    • Python dtype: str
    • Options:
      • RGB
      • red
      • green
      • blue
  • black_point

    • 图像输入黑点值。取值范围0-255, 默认值0。
    • Comfy dtype: INT
    • Python dtype: int
    • Range: [0, 255]
    • Default: 0
  • white_point

    • 图像输入白点值。取值范围0-255, 默认值255。
    • Comfy dtype: INT
    • Python dtype: int
    • Range: [0, 255]
    • Default: 255
  • gray_point

    • 图像输入灰点值。取值范围0.01-9.99, 默认值1。
    • Comfy dtype: FLOAT
    • Python dtype: float
    • Range: [0.01, 9.99]
    • Default: 1
  • output_black_point

    • 图像输出黑点值。取值范围0-255, 默认值0。
    • Comfy dtype: INT
    • Python dtype: int
    • Range: [0, 255]
    • Default: 0
  • output_white_point

    • 图像输出白点值。取值范围0-255, 默认值255。
    • Comfy dtype: INT
    • Python dtype: int
    • Range: [0, 255]
    • Default: 255

Output types

  • image
    • 输出的图片。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor

Usage tips

  • Infra type: GPU

Source code

class ColorCorrectLevels:

    def __init__(self):
        pass

    @classmethod
    def INPUT_TYPES(self):
        channel_list = ["RGB", "red", "green", "blue"]
        return {
            "required": {
                "image": ("IMAGE", ),  #
                "channel": (channel_list,),
                "black_point": ("INT", {"default": 0, "min": 0, "max": 255, "step": 1}),
                "white_point": ("INT", {"default": 255, "min": 0, "max": 255, "step": 1}),
                "gray_point": ("FLOAT", {"default": 1, "min": 0.01, "max": 9.99, "step": 0.01}),
                "output_black_point": ("INT", {"default": 0, "min": 0, "max": 255, "step": 1}),
                "output_white_point": ("INT", {"default": 255, "min": 0, "max": 255, "step": 1}),
            },
            "optional": {
            }
        }

    RETURN_TYPES = ("IMAGE",)
    RETURN_NAMES = ("image",)
    FUNCTION = 'levels'
    CATEGORY = '😺dzNodes/LayerColor'

    def levels(self, image, channel,
                      black_point, white_point,
                      gray_point, output_black_point, output_white_point):

        l_images = []
        l_masks = []
        ret_images = []

        for l in image:
            l_images.append(torch.unsqueeze(l, 0))
            m = tensor2pil(l)
            if m.mode == 'RGBA':
                l_masks.append(m.split()[-1])
            else:
                l_masks.append(Image.new('L', m.size, 'white'))


        for i in range(len(l_images)):
            _image = l_images[i]
            _mask = l_masks[i]
            orig_image = tensor2pil(_image)


            if channel == "red":
                r, g, b, _ = image_channel_split(orig_image, 'RGB')
                r = adjust_levels(r, black_point, white_point, gray_point,
                                          output_black_point, output_white_point)
                ret_image = image_channel_merge((r.convert('L'), g, b), 'RGB')
            elif channel == "green":
                r, g, b, _ = image_channel_split(orig_image, 'RGB')
                g = adjust_levels(g, black_point, white_point, gray_point,
                                  output_black_point, output_white_point)
                ret_image = image_channel_merge((r, g.convert('L'), b), 'RGB')
            elif channel == "blue":
                r, g, b, _ = image_channel_split(orig_image, 'RGB')
                b = adjust_levels(b, black_point, white_point, gray_point,
                                  output_black_point, output_white_point)
                ret_image = image_channel_merge((r, g, b.convert('L')), 'RGB')
            else:
                ret_image = adjust_levels(orig_image, black_point, white_point, gray_point,
                                          output_black_point, output_white_point)

            if orig_image.mode == 'RGBA':
                ret_image = RGB2RGBA(ret_image, orig_image.split()[-1])

            ret_images.append(pil2tensor(ret_image))

        log(f"{NODE_NAME} Processed {len(ret_images)} image(s).", message_type='finish')
        return (torch.cat(ret_images, dim=0),)