Spaces:
Sleeping
Sleeping
| from PIL import Image | |
| import os | |
| from typing import Literal, Optional | |
| def compress_image( | |
| input_path: str, | |
| output_path: str, | |
| quality: int = 85, | |
| format: Literal["JPEG", "PNG", "WEBP"] = "JPEG", | |
| max_width: Optional[int] = None, | |
| max_height: Optional[int] = None | |
| ) -> str: | |
| """ | |
| Compress an image file. | |
| Args: | |
| input_path: Path to input image | |
| output_path: Path for compressed output | |
| quality: Compression quality 1-95 (for JPEG/WEBP) | |
| format: Output format | |
| max_width: Maximum width (optional) | |
| max_height: Maximum height (optional) | |
| """ | |
| try: | |
| if not os.path.splitext(output_path)[1]: | |
| extension_map = {"JPEG": ".jpg", "PNG": ".png", "WEBP": ".webp"} | |
| output_path = output_path + extension_map[format] | |
| with Image.open(input_path) as img: | |
| if format == "JPEG" and img.mode in ("RGBA", "P"): | |
| img = img.convert("RGB") | |
| if max_width or max_height: | |
| img.thumbnail((max_width or img.width, max_height or img.height), Image.Resampling.LANCZOS) | |
| save_kwargs = {"format": format, "optimize": True} | |
| if format in ["JPEG", "WEBP"]: | |
| save_kwargs["quality"] = quality | |
| img.save(output_path, **save_kwargs) | |
| original_size = os.path.getsize(input_path) / 1024 / 1024 | |
| compressed_size = os.path.getsize(output_path) / 1024 / 1024 | |
| reduction = (1 - compressed_size/original_size) * 100 | |
| return f"✅ Compressed successfully!\nOriginal: {original_size:.2f}MB → Compressed: {compressed_size:.2f}MB\nReduction: {reduction:.1f}%" | |
| except Exception as e: | |
| return f"❌ Error: {str(e)}" |