Spaces:
Build error
Build error
| """ | |
| project @ NTO-TCP-HF | |
| created @ 2024-10-28 | |
| author @ github.com/ishworrsubedii | |
| """ | |
| from io import BytesIO | |
| from PIL import Image | |
| def crop_transparent_image(image_data: bytes) -> tuple[bytes, dict]: | |
| try: | |
| image = Image.open(BytesIO(image_data)) | |
| if image.format != 'PNG': | |
| raise ValueError("Only PNG images are supported") | |
| width = image.size[0] | |
| height = image.size[1] | |
| pixels = image.load() | |
| top = height | |
| bottom = 0 | |
| left = width | |
| right = 0 | |
| # Find boundaries of non-transparent pixels | |
| for y in range(height): | |
| for x in range(width): | |
| pixel = pixels[x, y] | |
| if isinstance(pixel, tuple) and len(pixel) == 4: | |
| if pixel[3] != 0: | |
| left = min(left, x) | |
| top = min(top, y) | |
| right = max(right, x) | |
| bottom = max(bottom, y) | |
| left = max(0, left) | |
| top = max(0, top) | |
| right = min(width, right + 1) | |
| bottom = min(height, bottom + 1) | |
| if left >= right or top >= bottom: | |
| left, top, right, bottom = 0, 0, width, height | |
| # Crop image | |
| cropped_image = image.crop((left, top, right, bottom)) | |
| output_buffer = BytesIO() | |
| cropped_image.save(output_buffer, format='PNG') | |
| output_buffer.seek(0) | |
| metadata = { | |
| "original_size": f"{width}x{height}", | |
| "cropped_size": f"{cropped_image.width}x{cropped_image.height}" | |
| } | |
| return output_buffer.getvalue(), metadata | |
| except Exception as e: | |
| raise ValueError(f"Error processing image: {str(e)}") | |