2gif-maker / app.py
Jeffgold's picture
Update app.py
03ceeb7 verified
raw
history blame
2.83 kB
import gradio as gr
from PIL import Image
import io
def create_gif(editor1_output, editor2_output):
img1 = editor1_output["composite"].convert('RGBA')
img2 = editor2_output["composite"].convert('RGBA')
frames = []
duration = 100 # Duration for each frame in milliseconds
total_frames = 18 # Total number of frames
size = (256, 256) # Fixed size for both images
img1 = img1.resize(size, Image.LANCZOS)
img2 = img2.resize(size, Image.LANCZOS)
full_width = size[0]
step = full_width // (total_frames // 2)
# Create sliding transition
for i in range(0, full_width, step):
frame = Image.new('RGBA', size)
frame.paste(img1, (0, 0))
frame.paste(img2.crop((0, 0, i, size[1])), (full_width - i, 0), mask=img2.crop((0, 0, i, size[1])))
frames.append(frame.convert('P', palette=Image.ADAPTIVE))
for i in range(full_width, 0, -step):
frame = Image.new('RGBA', size)
frame.paste(img2, (0, 0))
frame.paste(img1.crop((0, 0, i, size[1])), (full_width - i, 0), mask=img1.crop((0, 0, i, size[1])))
frames.append(frame.convert('P', palette=Image.ADAPTIVE))
# Save as GIF
output = io.BytesIO()
frames[0].save(output, format='GIF', save_all=True, append_images=frames[1:], duration=duration, loop=0, optimize=True)
output.seek(0)
# Save the GIF to a temporary file
temp_output_path = "output.gif"
with open(temp_output_path, "wb") as f:
f.write(output.getvalue())
return temp_output_path
# Gradio interface
with gr.Blocks() as iface:
gr.Markdown("# Advanced GIF Generator with Dual Image Editing")
with gr.Row():
with gr.Column(scale=2):
image_editor1 = gr.ImageEditor(
label="Edit Image 1",
brush=gr.Brush(colors=["#ff0000", "#00ff00", "#0000ff"]),
eraser=gr.Eraser(default_size=10),
height=300,
width="100%",
crop_size="1:1",
layers=True,
type="pil"
)
with gr.Column(scale=2):
image_editor2 = gr.ImageEditor(
label="Edit Image 2",
brush=gr.Brush(colors=["#ff0000", "#00ff00", "#0000ff"]),
eraser=gr.Eraser(default_size=10),
height=300,
width="100%",
crop_size="1:1",
layers=True,
type="pil"
)
with gr.Row():
generate_button = gr.Button("Generate GIF")
with gr.Row():
output_gif = gr.Image(type="filepath", label="Generated GIF", height=300)
generate_button.click(
create_gif,
inputs=[image_editor1, image_editor2],
outputs=[output_gif]
)
# Launch the interface
iface.launch()