Spaces:
Running
Running
import spaces | |
import gradio as gr | |
import re | |
from PIL import Image,ImageFilter | |
import os | |
import numpy as np | |
def process_images(fg_image, bg_image,fg_image_mask=None,dilate=0,blur=0): | |
# I'm not sure when this happen maybe api calling | |
#Basically ImageEditor's value are dictionary,If not convert value to dict | |
if not isinstance(fg_image, dict): | |
if fg_image_mask == None: | |
print("empty mask") | |
return image,None | |
else: | |
image = dict({'background': image, 'layers': [fg_image_mask]}) #no need? | |
if fg_image_mask!=None: | |
mask = fg_image_mask | |
else: | |
if len(fg_image['layers']) == 0: | |
print("empty mask") | |
return image,None | |
#print("use layer") | |
mask = fg_image['layers'][0] | |
mask = mask.convert("L") | |
if dilate>0: | |
if dilate%2 ==0: | |
dilate -= 1 | |
mask = mask.filter(ImageFilter.MaxFilter(dilate)) | |
if blur>0: | |
mask = mask.filter(ImageFilter.GaussianBlur(radius=blur)) | |
image2 = fg_image["background"].convert("RGBA") | |
if bg_image == None: | |
image2_masked = Image.composite(image2, Image.new("RGBA", image2.size, (0, 0, 0, 0)), mask) | |
return image2_masked,mask | |
bg_image = bg_image.convert("RGBA") | |
bg_image.paste(image2, (0, 0), mask) | |
return [bg_image,mask] | |
def read_file(path: str) -> str: | |
with open(path, 'r', encoding='utf-8') as f: | |
content = f.read() | |
return content | |
css=""" | |
#col-left { | |
margin: 0 auto; | |
max-width: 640px; | |
} | |
#col-right { | |
margin: 0 auto; | |
max-width: 640px; | |
} | |
.grid-container { | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
gap:10px | |
} | |
.image { | |
width: 128px; | |
height: 128px; | |
object-fit: cover; | |
} | |
.text { | |
font-size: 16px; | |
} | |
""" | |
with gr.Blocks(css=css, elem_id="demo-container") as demo: | |
with gr.Column(): | |
gr.HTML(read_file("demo_header.html")) | |
gr.HTML(read_file("demo_tools.html")) | |
with gr.Row(): | |
with gr.Column(): | |
image = gr.ImageEditor(height=800,sources=['upload','clipboard'],transforms=[],image_mode='RGB', layers=False, elem_id="Foreground", type="pil", label="Foreground",brush=gr.Brush(colors=["#fff"], color_mode="fixed")) | |
#image.height=1000 | |
btn = gr.Button("Paste to BG", elem_id="run_button",variant="primary") | |
bg_image = gr.Image(sources=['upload','clipboard'], elem_id="bg_image", type="pil", label="Background Image",height=400, value=None) | |
image_mask = gr.Image(sources=['upload','clipboard'], elem_id="mask_upload", type="pil", label="Mask Uploaded",height=400, value=None) | |
with gr.Accordion(label="Advanced Settings", open=False): | |
with gr.Row( equal_height=True): | |
blur = gr.Slider( | |
label="blur", | |
minimum=0, | |
maximum=100, | |
step=1, | |
value=5) | |
dilate = gr.Slider( | |
label="dilate", | |
minimum=0, | |
maximum=100, | |
step=1, | |
value=0) | |
id_input=gr.Text(label="Name", visible=False) | |
with gr.Column(): | |
image_out = gr.Image(height=800,sources=[],label="Output", elem_id="output-img",format="webp") | |
mask_out = gr.Image(height=800,sources=[],label="Mask", elem_id="mask-img",format="jpeg") | |
btn.click(fn=process_images, inputs=[image, bg_image,image_mask,dilate,blur], outputs =[image_out,mask_out], api_name='infer') | |
gr.Examples( | |
examples=[ | |
["examples/00533245_00004200_eyes.jpg","examples/00533245_00003200_mouth.jpg","examples/00533245_99_mask.jpg",5,18,"examples/00533245_mixed.jpg"], | |
["examples/00346245_00006200.jpg", "examples/00346245_00003200.jpg","examples/00346245_mask.jpg",10,0,"examples/00346245_mixed.jpg"] | |
] | |
, | |
inputs=[image,bg_image,image_mask,blur,dilate,image_out] | |
) | |
gr.HTML(read_file("demo_footer.html")) | |
if __name__ == "__main__": | |
demo.launch() | |