leonelhs/pillow
1
1import gradio as gr2 3from utils import *4from filters import *5 6builtin_funcs = {7 "Blur": blur,8 "Contour": contour,9 "Detail": detail,10 "Edge enhance": edge,11 "Edge enhance more": edgeMore,12 "Emboss": emboss,13 "Find edges": findEdges,14 "Sharpen": sharpen,15 "Smoot": smoot,16 "Smoot More": smootMore17}18 19radio_funcs = {20 "Gaussian Blur": gaussianBlur,21 "Box Blur": boxBlur22}23 24builtin_choices = keys(builtin_funcs)25radio_choices = keys(radio_funcs)26 27 28def convolution(image, kernel, size, scale, offset, iterations):29 if isinstance(kernel, str):30 size = split_numbers(size)31 kernel = split_numbers(kernel)32 result = image.filter(ImageFilter.Kernel(size, kernel, scale, offset))33 if iterations == 1:34 return result35 return convolution(result, kernel, size, scale, offset, iterations - 1)36 37 38def filters_builtin(image, func):39 return builtin_funcs[func](image)40 41 42def filters_radio(image, func, radio):43 return radio_funcs[func](image, radio)44 45 46def mirror(x):47 return x48 49 50footer = r"""51<center>52<b>53Demo based on <a href='https://github.com/leonelhs/pillow-gui'>Pillow Tool Utility</a>54</b>55</center>56"""57 58with gr.Blocks(title="Pillow Tool") as app:59 gr.HTML("<center><h1>Pillow Tool Utility</h1></center>")60 61 with gr.Row(equal_height=False):62 63 with gr.Column():64 input_img = gr.Image(type="pil", label="Input image")65 with gr.Accordion(label="Basic filters", open=True):66 drp_builtin = gr.Dropdown(choices=builtin_choices, label="Filter functions", value="Blur")67 gr.HTML("</br>")68 bti_btn = gr.Button(value="Filter")69 with gr.Accordion(label="Blur filters", open=False):70 rdi_builtin = gr.Dropdown(choices=radio_choices, label="Filter Blur", value="Gaussian Blur")71 blr_rad = gr.Slider(1, 100, step=1, value=1, label="Blur radius")72 gr.HTML("</br>")73 rad_btn = gr.Button(value="Blurry")74 with gr.Accordion(label="Unsharp filter", open=False):75 unsr_rad = gr.Slider(1, 100, step=1, value=1, label="Unshap mask radius")76 unsr_per = gr.Slider(1, 200, step=1, value=1, label="Unshap percent")77 unsr_tre = gr.Slider(1, 10, step=1, value=1, label="Unshap threshold")78 gr.HTML("</br>")79 srp_btn = gr.Button(value="Unsharp")80 with gr.Accordion(label="Convolution filter", open=False):81 ker_txt = gr.Textbox(label="Kernel", value="-1, -1, -1, -1, 9, -1, -1, -1, -1")82 siz_txt = gr.Textbox(label="Kernel Size", value="3,3")83 with gr.Row():84 scl_txt = gr.Number(label="Scale", value=1)85 ofs_txt = gr.Number(label="Offset", value=0)86 itr_txt = gr.Number(label="Iterations", value=1, minimum=1, maximum=10)87 gr.HTML("</br>")88 ker_btn = gr.Button(value="Convolution")89 90 with gr.Column():91 output_img = gr.Image(type="pil", label="Output image", interactive=False)92 kpt_btn = gr.Button(value="Keep it", variant="primary")93 gr.ClearButton(components=[input_img, output_img])94 95 bti_btn.click(filters_builtin, [input_img, drp_builtin], [output_img])96 rad_btn.click(filters_radio, inputs=[input_img, rdi_builtin, blr_rad], outputs=[output_img])97 srp_btn.click(unsharpMask, inputs=[input_img, unsr_rad, unsr_per, unsr_tre], outputs=[output_img])98 ker_btn.click(convolution, [input_img, ker_txt, siz_txt, scl_txt, ofs_txt, itr_txt], [output_img])99 kpt_btn.click(mirror, inputs=[output_img], outputs=[input_img])100 101 with gr.Row():102 gr.HTML(footer)103 104app.launch(share=False, debug=True, show_error=True, mcp_server=True)105app.queue()106 