lodhrangpt's picture
Update app.py
142cd24 verified
import gradio as gr
from PIL import Image
import io
import tempfile
def compress_image(input_image, output_format, quality=85):
"""
Compress an image and return the compressed image as a file.
Parameters:
- input_image (PIL.Image.Image): The input image.
- output_format (str): The format of the output image ('JPEG', 'JPG', 'PNG', or 'WEBP').
- quality (int, optional): The quality of the output image (1-100). Default is 85.
Returns:
- str: The path to the temporary file containing the compressed image.
"""
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)
# Save the compressed image to a temporary file
img_byte_arr = img_byte_arr.getvalue() # Convert to bytes
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 # Get the temporary file path
return temp_file_path
def image_compression_interface(uploaded_image, output_format, quality):
try:
# Open the image using PIL
image = Image.open(uploaded_image)
# Convert image to RGB if it has an alpha channel and the output format is JPEG, JPG, or WEBP
if image.mode in ("RGBA", "P") and output_format.upper() in ['JPEG', 'JPG', 'WEBP']:
image = image.convert("RGB")
# Compress the image and save to a temporary file
compressed_image_path = compress_image(image, output_format, quality)
# Return the path to the compressed image file
return compressed_image_path
except Exception as e:
return str(e)
# Create the Gradio interface
def create_gradio_interface():
# Input components for Gradio (Updated for Gradio v3+)
image_input = gr.File(label="Upload Image") # Changed to gr.File to handle raw file upload
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")
# Output components for Gradio (Updated for Gradio v3+)
image_output = gr.File(label="Download Compressed Image") # Use gr.File for download
# Set up the Gradio interface
gr.Interface(
fn=image_compression_interface,
inputs=[image_input, output_format_input, quality_input],
outputs=[image_output],
).launch()
if __name__ == "__main__":
create_gradio_interface()