"""
downloads: https://luts.iwltbap.com/
lib: https://github.com/homm/pillow-lut-tools
"""
import os
import gradio as gr
from installer import install
from modules import scripts_manager, shared, processing
class Script(scripts_manager.Script):
def title(self):
return 'LUT Color grading'
def show(self, is_img2img): # pylint: disable=unused-argument
return True
def ui(self, _is_img2img):
with gr.Row():
gr.HTML("  LUT Color grading
")
with gr.Row():
original = gr.Checkbox(label='Include original image', value=True)
with gr.Row():
cube_file = gr.File(label='LUT .cube file', help='Download LUTs from https://luts.iwltbap.com/')
# cube_file = gr.File(label='LUT .cube file')
with gr.Row():
gr.HTML("
Enhance LUT")
with gr.Row():
cube_scale = gr.Slider(label='Amplify LUT', minimum=0.0, maximum=5.0, step=0.05, value=1.0)
brightness = gr.Slider(label='Brightness', minimum=-1, maximum=1, step=0.05, value=0)
exposure = gr.Slider(label='Exposure', minimum=-5, maximum=5, step=0.05, value=0)
contrast = gr.Slider(label='Contrast', minimum=-1, maximum=1, step=0.05, value=0)
warmth = gr.Slider(label='Warmth', minimum=-1, maximum=1, step=0.05, value=0)
saturation = gr.Slider(label='Saturation', minimum=-1, maximum=5, step=0.05, value=0)
vibrance = gr.Slider(label='Vibrance', minimum=-1, maximum=5, step=0.05, value=0)
hue = gr.Slider(label='Hue', minimum=0, maximum=1, step=0.05, value=0)
gamma = gr.Slider(label='Gamma', minimum=0, maximum=10.0, step=0.1, value=1.0)
return [original, cube_file, cube_scale, brightness, exposure, contrast, warmth, saturation, vibrance, hue, gamma]
# auto-executed by the script-callback
def after(self, p: processing.StableDiffusionProcessing, processed: processing.Processed, original, cube_file, cube_scale, brightness, exposure, contrast, warmth, saturation, vibrance, hue, gamma): # pylint: disable=arguments-differ, unused-argument
install('pillow_lut', quiet=True)
import pillow_lut
cube = None
name = os.path.splitext(os.path.basename(cube_file.name))[0] if cube_file is not None else None
shared.log.info(f'Color grading: cube="{name}" scale={cube_scale} brightness={brightness} exposure={exposure} contrast={contrast} warmth={warmth} saturation={saturation} vibrance={vibrance} hue={hue} gamma={gamma}')
if cube_file is not None:
try:
cube = pillow_lut.load_cube_file(cube_file.name)
cube = pillow_lut.amplify_lut(cube, cube_scale)
cube = pillow_lut.rgb_color_enhance(source=cube, brightness=brightness, exposure=exposure, contrast=contrast, warmth=warmth, saturation=saturation, vibrance=vibrance, hue=hue, gamma=gamma)
except Exception as e:
shared.log.error(f'Color grading: {e}')
images = []
if processed is not None and len(processed.images) > 0:
for image in processed.images:
info = image.info.get('parameters', '')
if original:
images.append(image)
if cube is not None:
filtered = image.filter(cube)
filtered.info['parameters'] = f'{info}, LUT: {name}'
images.append(filtered)
processed.images = images
return processed