# Documentation - Class name: DodgeAndBurn - Category: postprocessing/Blends - Output node: False - Repo Ref: https://github.com/EllangoK/ComfyUI-post-processing-nodes DodgeAndBurn节点旨在通过应用 dodge 和 burn 技术来增强图像,这些技术可以操纵图像中特定区域的亮度和对比度。通过使用遮罩和调整强度,此节点可以选择性地变亮或变暗区域,创建深度并吸引人们对特定区域的注意。 # Input types ## Required - image - 图像参数是 DodgeAndBurn 节点的主要输入,它将成为通过 dodging 和 burning 技术修改的基础层。其质量和内容直接影响最终输出。 - Comfy dtype: IMAGE - Python dtype: torch.Tensor - mask - 遮罩参数决定了图像中哪些区域将受到 dodge 和 burn 过程的影响。它在控制对图像进行的调整的精确性方面起着至关重要的作用。 - Comfy dtype: IMAGE - Python dtype: torch.Tensor - intensity - 强度是一个关键参数,它控制应用于图像的变亮或变暗的程度。调整此值会影响 dodge 和 burn 技术的整体影响。 - Comfy dtype: FLOAT - Python dtype: float - mode - 模式参数决定了要应用的特定 dodge 和 burn 技术。它影响图像调整的方式,满足不同的创意或风格偏好。 - Comfy dtype: COMBO[ ['dodge', 'burn', 'dodge_and_burn', 'burn_and_dodge', 'color_dodge', 'color_burn', 'linear_dodge', 'linear_burn'],] - Python dtype: str # Output types - output_image - 输出图像代表 dodge 和 burn 过程的最终结果,反映了基于输入参数对原始图像所做的调整。 - Comfy dtype: IMAGE - Python dtype: torch.Tensor # Usage tips - Infra type: CPU # Source code ``` class DodgeAndBurn: def __init__(self): pass @classmethod def INPUT_TYPES(s): return {'required': {'image': ('IMAGE',), 'mask': ('IMAGE',), 'intensity': ('FLOAT', {'default': 0.5, 'min': 0.0, 'max': 1.0, 'step': 0.01}), 'mode': (['dodge', 'burn', 'dodge_and_burn', 'burn_and_dodge', 'color_dodge', 'color_burn', 'linear_dodge', 'linear_burn'],)}} RETURN_TYPES = ('IMAGE',) FUNCTION = 'dodge_and_burn' CATEGORY = 'postprocessing/Blends' def dodge_and_burn(self, image: torch.Tensor, mask: torch.Tensor, intensity: float, mode: str): if mode in ['dodge', 'color_dodge', 'linear_dodge']: dodged_image = self.dodge(image, mask, intensity, mode) return (dodged_image,) elif mode in ['burn', 'color_burn', 'linear_burn']: burned_image = self.burn(image, mask, intensity, mode) return (burned_image,) elif mode == 'dodge_and_burn': dodged_image = self.dodge(image, mask, intensity, 'dodge') burned_image = self.burn(dodged_image, mask, intensity, 'burn') return (burned_image,) elif mode == 'burn_and_dodge': burned_image = self.burn(image, mask, intensity, 'burn') dodged_image = self.dodge(burned_image, mask, intensity, 'dodge') return (dodged_image,) else: raise ValueError(f'Unsupported dodge and burn mode: {mode}') def dodge(self, img, mask, intensity, mode): if mode == 'dodge': return img / (1 - mask * intensity + 1e-07) elif mode == 'color_dodge': return torch.where(mask < 1, img / (1 - mask * intensity), img) elif mode == 'linear_dodge': return torch.clamp(img + mask * intensity, 0, 1) else: raise ValueError(f'Unsupported dodge mode: {mode}') def burn(self, img, mask, intensity, mode): if mode == 'burn': return 1 - (1 - img) / (mask * intensity + 1e-07) elif mode == 'color_burn': return torch.where(mask > 0, 1 - (1 - img) / (mask * intensity), img) elif mode == 'linear_burn': return torch.clamp(img - mask * intensity, 0, 1) else: raise ValueError(f'Unsupported burn mode: {mode}') ```