enhancer / app.py
namelessai's picture
Update app.py
3c41bec verified
Raw
History Blame Contribute Delete
3.72 kB
import os
import gradio as gr
import requests
import base64
from PIL import Image
from io import BytesIO
import tempfile
import zipfile
API_KEY = os.getenv("SEGMIND_API_KEY")
API_URL = "https://api.segmind.com/v1/nomos-upscaler"
def image_file_to_base64(image_path):
with open(image_path, 'rb') as f:
image_data = f.read()
return base64.b64encode(image_data).decode('utf-8')
def image_url_to_base64(image_url):
response = requests.get(image_url)
image_data = response.content
return base64.b64encode(image_data).decode('utf-8')
def upscale_single_image(base64_image):
data = {
"image": base64_image,
"image_format": "png",
"image_quality": 95,
"base64": False
}
headers = {'x-api-key': API_KEY}
response = requests.post(API_URL, json=data, headers=headers)
if response.status_code == 200:
return Image.open(BytesIO(response.content))
else:
raise Exception(f"API Error: {response.status_code} - {response.text}")
def upscale_images(files, urls, state):
results = []
filepaths = []
temp_dir = tempfile.mkdtemp()
# Process uploaded files
if files:
for file_path in files:
try:
base64_img = image_file_to_base64(file_path)
upscaled_img = upscale_single_image(base64_img)
out_path = os.path.join(temp_dir, f"upscaled_{os.path.basename(file_path)}.png")
upscaled_img.save(out_path, format="PNG")
results.append(upscaled_img)
filepaths.append(out_path)
except Exception as e:
results.append(f"Error: {str(e)}")
# Process URLs
if urls:
url_list = [u.strip() for u in urls.splitlines() if u.strip()]
for idx, url in enumerate(url_list):
try:
base64_img = image_url_to_base64(url)
upscaled_img = upscale_single_image(base64_img)
out_path = os.path.join(temp_dir, f"upscaled_url_{idx+1}.png")
upscaled_img.save(out_path, format="PNG")
results.append(upscaled_img)
filepaths.append(out_path)
except Exception as e:
results.append(f"Error: {str(e)}")
# Update state with new filepaths
state = filepaths
return results, state
def zip_upscaled_images(state):
if not state:
return None
temp_zip = tempfile.NamedTemporaryFile(delete=False, suffix=".zip")
with zipfile.ZipFile(temp_zip.name, 'w') as zipf:
for fpath in state:
zipf.write(fpath, arcname=os.path.basename(fpath))
return temp_zip.name
with gr.Blocks() as demo:
gr.Markdown("# Bulk Image Upscaler\nUpload multiple images or paste image URLs (one per line). Download all upscaled images as a zip.")
state = gr.State([])
with gr.Row():
file_input = gr.File(label="Upload Images", file_count="multiple", type="filepath")
url_input = gr.Textbox(label="Image URLs (one per line)", lines=5)
output_gallery = gr.Gallery(label="Upscaled Images", show_label=True)
run_btn = gr.Button("Upscale Images")
download_zip_btn = gr.Button("Download All as ZIP")
zip_file_output = gr.File(label="Download ZIP")
run_btn.click(
upscale_images,
inputs=[file_input, url_input, state],
outputs=[output_gallery, state]
)
download_zip_btn.click(
zip_upscaled_images,
inputs=[state],
outputs=zip_file_output
)
if __name__ == "__main__":
# Make sure to set the environment variable SEGMIND_API_KEY before running
# For example, in Linux/Mac: export SEGMIND_API_KEY=your_api_key
demo.launch()