try_image / app.py
lodhrangpt's picture
Update app.py
f2a3b89 verified
import gradio as gr
from PIL import Image
import io
import tempfile
def compress_image(input_image, output_format, quality=85):
img_byte_arr = io.BytesIO()
if output_format.upper() in ['JPEG', 'JPG']:
input_image.save(img_byte_arr, format='JPEG', quality=quality)
elif output_format.upper() == 'PNG':
input_image.save(img_byte_arr, format='PNG', compress_level=int((100-quality)/10))
elif output_format.upper() == 'WEBP':
input_image.save(img_byte_arr, format='WEBP', quality=quality)
img_byte_arr = img_byte_arr.getvalue()
with tempfile.NamedTemporaryFile(delete=False, suffix=f'.{output_format.lower()}') as temp_file:
temp_file.write(img_byte_arr)
temp_file_path = temp_file.name
return temp_file_path
def image_compression_interface(uploaded_image, output_format, quality):
try:
image = Image.open(uploaded_image)
if image.mode in ("RGBA", "P") and output_format.upper() in ['JPEG', 'JPG', 'WEBP']:
image = image.convert("RGB")
compressed_image_path = compress_image(image, output_format, quality)
return compressed_image_path
except Exception as e:
return str(e)
def get_current_size(compressed_image_path):
try:
with open(compressed_image_path, 'rb') as f:
size = len(f.read())
return f"Current Size: {size} bytes"
except FileNotFoundError:
return "Image not found"
def update_ui(uploaded_image, output_format, quality):
try:
image = Image.open(uploaded_image)
if image.mode in ("RGBA", "P") and output_format.upper() in ['JPEG', 'JPG', 'WEBP']:
image = image.convert("RGB")
compressed_image_path = compress_image(image, output_format, quality)
current_size = get_current_size(compressed_image_path)
return [compressed_image_path, current_size]
except Exception as e:
return [str(e), None]
def create_gradio_interface():
image_input = gr.File(label="Upload Image")
output_format_input = gr.Dropdown(choices=["JPEG", "JPG", "PNG", "WEBP"], label="Select Output Format")
quality_input = gr.Slider(minimum=1, maximum=100, step=1, value=85, label="Select Compression Quality")
size_display = gr.Textbox(label="Current Size")
def on_quality_change(quality):
try:
image = Image.open(uploaded_image.value)
if image.mode in ("RGBA", "P") and output_format_input.value.upper() in ['JPEG', 'JPG', 'WEBP']:
image = image.convert("RGB")
compressed_image_path = compress_image(image, output_format_input.value, quality)
current_size = get_current_size(compressed_image_path)
return current_size
except Exception as e:
return str(e)
quality_input.change(on_quality_change, inputs=[quality_input], outputs=size_display)
gr.Interface(
fn=update_ui,
inputs=[image_input, output_format_input, quality_input],
outputs=[gr.File(label="Download Compressed Image"), size_display],
).launch()
if __name__ == "__main__":
create_gradio_interface()