image_upscaler / app.py
patrawtf's picture
undo the central generate edit
6d12608
import streamlit as st
import asyncio
from PIL import Image
from app.upscale import ImageUpscaler
img_upscale = ImageUpscaler()
async def async_upscaler(image_stream, factor):
return await img_upscale.upscaler(target_img=image_stream, factor=factor, byte_stream=True)
def calculate_new_dimension(original_size, entered_size, dimension_type):
original_width, original_height = original_size
aspect_ratio = original_width / original_height
if dimension_type == 'width':
new_width = entered_size
new_height = round(new_width / aspect_ratio)
return new_width, new_height
else:
new_height = entered_size
new_width = round(new_height * aspect_ratio)
return new_width, new_height
def calculate_factor(original_size, target_size):
return target_size[0] / original_size[0], target_size[1] / original_size[1]
def main():
if 'user_factor' not in st.session_state:
st.session_state.user_factor = None
password = st.text_input("Enter Password", type='password')
if password != '1bz@123':
st.stop()
cols = st.columns([3,5,2])
logo_url = 'https://media.licdn.com/dms/image/D560BAQGQxI71sZ1vTQ/company-logo_200_200/0/1687829291546?e=1703721600&v=beta&t=5RnOK7-Ak8cj1EQose8HQHWUYXPXRpI-x2dnjGjUABg'
cols[0].image(logo_url, width=int(200 * 0.8))
cols[1].markdown("<h1 style='text-align: left; color: black;'>IMAGE UPSCALER</h1>", unsafe_allow_html=True)
cols[1].markdown("This is a PoC application for upscaling images.")
cols[1].markdown("[onebyzero.ai](http://www.onebyzero.ai)", unsafe_allow_html=True)
uploaded_image = st.file_uploader('Upload target image (Required)', type=['jpeg', 'jpg', 'png'])
if uploaded_image is not None:
image = Image.open(uploaded_image)
Image_stream = img_upscale.pil2byte(image)
original_size = image.size
st.write(f"Original Image Resolution: {original_size[0]} x {original_size[1]}")
col1, mid_col, col2 = st.columns([3, 1, 3])
with col1:
dimension_type = st.radio("Dimension Type:", ('width', 'height'))
entered_size = st.number_input("Enter Target Width or Height:", min_value=1, value=original_size[0])
if st.button("Calculate Target Resolution"):
if dimension_type == 'width':
target_size = calculate_new_dimension(original_size, entered_size, 'width')
else:
target_size = calculate_new_dimension(original_size, entered_size, 'height')
st.write(f"Target Resolution: {target_size[0]} x {target_size[1]}")
factor_x, factor_y = calculate_factor(original_size, target_size)
st.session_state.user_factor = round(min(factor_x, factor_y), 2)
st.write(f"Calculated Upscaling Factor: {st.session_state.user_factor}")
with mid_col:
st.markdown("<h2 style='text-align: center;'>OR</h2>", unsafe_allow_html=True)
with col2:
factor_slider = st.slider('Choose Upscaling Factor:', min_value=1.0, max_value=10.0, value=1.0, step=0.5, format="")
st.write(f"Selected Upscaling Factor: {factor_slider}")
if st.button("Generate"):
factor = st.session_state.user_factor if st.session_state.user_factor is not None else factor_slider
with st.spinner('Generating images...'):
result_image_stream = asyncio.run(async_upscaler(Image_stream, factor))
try:
print(type(result_image_stream))
st.image(result_image_stream.getvalue())
except Exception as e:
st.error(f"An error occurred during image upscaling: {e}")
if __name__ == "__main__":
main()
st.markdown(""" --- """)
st.markdown("<h6 style='text-align: left; color: grey;'>Created by <a href='mailto:[email protected]'>Sandeep Patra</a></h6>", unsafe_allow_html=True)