sidewalk-sam / baby_shiny.py
David Vaillant
Basic func.
a073fdd
from shiny import App, Inputs, Outputs, Session, reactive, render, ui
from shiny.types import FileInfo, ImgData
import asyncio
import concurrent.futures
import backend
import numpy as np
from PIL import Image, ImageDraw
from pathlib import Path
import tempfile
def draw_layer_on_image(im: Image) -> Image:
"""Draws something on top of an image."""
# Attempting to use thresholds.
threshold: int = 1
output_im = np.array(im)
# return Image.fromarray(output_im)
# The image drawing code.
draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128, width=5)
draw.line((0, im.size[1], im.size[0], 0), fill=128)
return im
# UI:
# TITLE ELEMENT, centered
# input, centered.
# table in middle. Upload, displays image on the left.
# arrow in the middle, mask on the right.
card_height = '700px'
app_ui = ui.page_fixed(
ui.input_file("file1", "Upload a sidewalk.", accept=[".jpg", ".png", ".jpeg"], multiple=False),
ui.layout_columns(
ui.card(
ui.card_header("Uploaded Image"),
ui.output_image("show_image"),
height=card_height
),
ui.card(
ui.card_header("Image Mask"),
# ui.input_task_button("mask_btn", "Process mask"),
ui.output_image("samwalk"),
height=card_height
),
)
)
def strip_alpha(image: Image) -> Image:
# Create a white background
background = Image.new('RGBA', image.size, (255, 255, 255, 255))
composite = Image.alpha_composite(background, image)
rgb_image = composite.convert('RGB')
return rgb_image
def server(input: Inputs, output: Outputs, session: Session):
uploaded_img = None
@reactive.calc
def parsed_file():
file: list[FileInfo] | None = input.file1()
if file is None:
return
return file[0]
@render.image
def show_image():
uploaded_img = parsed_file()
if uploaded_img is None:
return
uploaded_src = uploaded_img['datapath']
img: ImgData = {"src": str(uploaded_src), "width": "500px"}
return img
# @reactive.event(input.mask_btn)
@render.image
def samwalk():
uploaded_file = parsed_file()
if uploaded_file is None:
return
uploaded_src = uploaded_file['datapath']
uploaded_img = Image.open(uploaded_src)
if uploaded_img.mode == 'RGBA':
uploaded_img = strip_alpha(uploaded_img)
dirpath = tempfile.mkdtemp()
# output_img = async_process_image(uploaded_img)
# while output_img is None:
# pass
# output_img = output_img.result()
# # return {"src": str("waiting.gif"), "width": "500px"}
output_img = backend.process_image(uploaded_img)
output_path = dirpath / Path(uploaded_src)
output_img.save(output_path)
return {"src": str(output_path), "width": "500px"}
app = App(app_ui, server)