import math from PIL import Image from PIL import ImageEnhance from sd_bmab import util from sd_bmab.base.context import Context from sd_bmab.base.processorbase import ProcessorBase def calc_color_temperature(temp): white = (255.0, 254.11008387561782, 250.0419083427406) temperature = temp / 100 if temperature <= 66: red = 255.0 else: red = float(temperature - 60) red = 329.698727446 * math.pow(red, -0.1332047592) if red < 0: red = 0 if red > 255: red = 255 if temperature <= 66: green = temperature green = 99.4708025861 * math.log(green) - 161.1195681661 else: green = float(temperature - 60) green = 288.1221695283 * math.pow(green, -0.0755148492) if green < 0: green = 0 if green > 255: green = 255 if temperature >= 66: blue = 255.0 else: if temperature <= 19: blue = 0.0 else: blue = float(temperature - 10) blue = 138.5177312231 * math.log(blue) - 305.0447927307 if blue < 0: blue = 0 if blue > 255: blue = 255 return red / white[0], green / white[1], blue / white[2] class FinalProcessorBasic(ProcessorBase): def __init__(self) -> None: super().__init__() self.noise_alpha_final = 0 self.contrast = 1 self.brightness = 1 self.sharpeness = 1 self.color_saturation = 1 self.color_temperature = 0 def preprocess(self, context: Context, image: Image): self.contrast = context.args['contrast'] self.brightness = context.args['brightness'] self.sharpeness = context.args['sharpeness'] self.color_saturation = context.args['color_saturation'] self.color_temperature = context.args['color_temperature'] self.noise_alpha_final = context.args['noise_alpha_final'] return True def process(self, context: Context, image: Image): if self.noise_alpha_final != 0: context.add_generation_param('BMAB noise alpha final', self.noise_alpha_final) img_noise = util.generate_noise(context.sdprocessing.seed, image.size[0], image.size[1]) image = Image.blend(image, img_noise, alpha=self.noise_alpha_final) if self.contrast != 1: context.add_generation_param('BMAB contrast', self.contrast) enhancer = ImageEnhance.Contrast(image) image = enhancer.enhance(self.contrast) if self.brightness != 1: context.add_generation_param('BMAB brightness', self.brightness) enhancer = ImageEnhance.Brightness(image) image = enhancer.enhance(self.brightness) if self.sharpeness != 1: context.add_generation_param('BMAB sharpeness', self.sharpeness) enhancer = ImageEnhance.Sharpness(image) image = enhancer.enhance(self.sharpeness) if self.color_saturation != 1: context.add_generation_param('BMAB color', self.color_saturation) enhancer = ImageEnhance.Color(image) image = enhancer.enhance(self.color_saturation) if self.color_temperature != 0: context.add_generation_param('BMAB color temperature', self.color_temperature) temp = calc_color_temperature(6500 + self.color_temperature) az = [] for d in image.getdata(): az.append((int(d[0] * temp[0]), int(d[1] * temp[1]), int(d[2] * temp[2]))) image = Image.new('RGB', image.size) image.putdata(az) return image def postprocess(self, context: Context, image: Image): pass