from PIL import Image, ImageEnhance, ImageOps import numpy as np from pathlib import Path import colorsys import logging def apply_custom_filter(img_path, bright, cont, sat, hue): if not img_path: return None, "❌ Please upload an image" try: img = Image.open(img_path) if bright != 0: enhancer = ImageEnhance.Brightness(img) img = enhancer.enhance(1 + bright / 100) if cont != 0: enhancer = ImageEnhance.Contrast(img) img = enhancer.enhance(1 + cont / 100) if sat != 0: enhancer = ImageEnhance.Color(img) img = enhancer.enhance(1 + sat / 100) if hue != 0 and img.mode == "RGB": img_array = np.array(img) hsv = np.array([colorsys.rgb_to_hsv(r/255, g/255, b/255) for r, g, b in img_array.reshape(-1, 3)]) hsv[:, 0] = (hsv[:, 0] + hue / 360) % 1.0 rgb = np.array([colorsys.hsv_to_rgb(h, s, v) for h, s, v in hsv]) img_array = (rgb * 255).astype(np.uint8).reshape(img_array.shape) img = Image.fromarray(img_array) out_path = Path(img_path).with_name(f"filtered_{Path(img_path).name}") img.save(out_path) return str(out_path), "✅ Custom filter applied successfully" except Exception as e: logging.exception("Custom filter failed") return None, f"❌ Filter error: {str(e)}"