| from PIL import Image, ImageEnhance, ImageFilter, ImageOps | |
| import numpy as np | |
| import cv2 | |
| from pathlib import Path | |
| from rembg import remove | |
| import logging | |
| class ImageProcessor: | |
| def convert_image(self, input_path, output_format, quality=95): | |
| try: | |
| img = Image.open(input_path) | |
| if output_format.upper() in ["JPEG", "JPG", "BMP", "PDF"]: | |
| if img.mode in ("RGBA", "LA", "P"): | |
| background = Image.new("RGB", img.size, (255, 255, 255)) | |
| if img.mode == "P": | |
| img = img.convert("RGBA") | |
| background.paste(img, mask=img.split()[-1] if img.mode in ("RGBA", "LA") else None) | |
| img = background | |
| else: | |
| img = img.convert("RGB") | |
| elif output_format.upper() == "PNG": | |
| if img.mode != "RGBA": | |
| img = img.convert("RGBA") | |
| elif output_format.upper() in ["TIFF", "TIF"]: | |
| pass | |
| else: | |
| img = img.convert("RGB") | |
| out_path = Path(input_path).with_suffix(f".{output_format.lower()}") | |
| save_kwargs = {} | |
| if output_format.upper() in ["JPEG", "JPG"]: | |
| save_kwargs = {"quality": quality, "optimize": True} | |
| elif output_format.upper() == "PNG": | |
| save_kwargs = {"optimize": True} | |
| elif output_format.upper() == "WEBP": | |
| save_kwargs = {"quality": quality, "method": 6} | |
| img.save(out_path, format=output_format.upper(), **save_kwargs) | |
| return str(out_path), f"β Converted to {output_format.upper()}" | |
| except Exception as e: | |
| logging.exception("Image conversion failed") | |
| return None, f"β Error: {str(e)}" | |
| def enhance_image(self, input_path, enhancement_type, intensity=1.0): | |
| try: | |
| img = Image.open(input_path) | |
| if enhancement_type == "AI Super Resolution": | |
| img = img.resize((img.width * 2, img.height * 2), Image.LANCZOS) | |
| elif enhancement_type == "Noise Reduction": | |
| cv_img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) | |
| denoised = cv2.fastNlMeansDenoisingColored(cv_img, None, 10, 10, 7, 21) | |
| img = Image.fromarray(cv2.cvtColor(denoised, cv2.COLOR_BGR2RGB)) | |
| elif enhancement_type == "Color Enhancement": | |
| enhancer = ImageEnhance.Color(img) | |
| img = enhancer.enhance(1.0 + intensity * 0.5) | |
| elif enhancement_type == "Brightness/Contrast": | |
| brightness = ImageEnhance.Brightness(img) | |
| img = brightness.enhance(1.0 + intensity * 0.2) | |
| contrast = ImageEnhance.Contrast(img) | |
| img = contrast.enhance(1.0 + intensity * 0.3) | |
| elif enhancement_type == "Sharpening": | |
| enhancer = ImageEnhance.Sharpness(img) | |
| img = enhancer.enhance(1.0 + intensity) | |
| elif enhancement_type == "HDR Effect": | |
| img_array = np.array(img, dtype=np.float32) / 255.0 | |
| img_array = np.power(img_array, 0.5 + intensity * 0.3) | |
| img = Image.fromarray((img_array * 255).astype(np.uint8)) | |
| elif enhancement_type == "Black & White": | |
| img = img.convert("L").convert("RGB") | |
| elif enhancement_type == "Sepia": | |
| img = ImageOps.colorize(img.convert("L"), "#704214", "#C8B99C") | |
| elif enhancement_type == "Vintage Filter": | |
| img = ImageEnhance.Contrast(img).enhance(0.8) | |
| img = ImageEnhance.Brightness(img).enhance(1.1) | |
| img = ImageEnhance.Color(img).enhance(0.7) | |
| elif enhancement_type == "Vignette": | |
| mask = Image.new("L", img.size, 0) | |
| center_x, center_y = img.size[0] // 2, img.size[1] // 2 | |
| max_dist = min(center_x, center_y) | |
| for y in range(img.size[1]): | |
| for x in range(img.size[0]): | |
| dist = ((x - center_x) ** 2 + (y - center_y) ** 2) ** 0.5 | |
| alpha = max(0, 255 - int(255 * dist / max_dist * intensity)) | |
| mask.putpixel((x, y), alpha) | |
| img.putalpha(mask) | |
| background = Image.new("RGB", img.size, (0, 0, 0)) | |
| background.paste(img, img) | |
| img = background | |
| out_path = Path(input_path).with_name(f"enhanced_{Path(input_path).name}") | |
| img.save(out_path) | |
| return str(out_path), f"β Applied {enhancement_type} enhancement" | |
| except Exception as e: | |
| logging.exception("Image enhancement failed") | |
| return None, f"β Enhancement error: {str(e)}" | |
| def remove_background(self, input_path, service="local"): | |
| try: | |
| if service == "local": | |
| img = Image.open(input_path) | |
| result = remove(img) | |
| out_path = Path(input_path).with_name(f"nobg_{Path(input_path).name}") | |
| result.save(out_path) | |
| return str(out_path), "β Background removed locally" | |
| else: | |
| return None, f"β Service {service} not implemented in this module" | |
| except Exception as e: | |
| logging.exception("Background removal failed") | |
| return None, f"β Background removal error: {str(e)}" | |