""" Image preprocessing and validation utilities. No framework dependencies — safe to use in both Streamlit and FastAPI. """ import numpy as np from PIL import Image def validate_image(image: Image.Image) -> tuple: """ Basic sanity checks on the uploaded image. Returns: (True, "") if valid (False, reason_str) if invalid """ if image is None: return False, "No image provided." w, h = image.size if w < 100 or h < 100: return False, "Image resolution too low. Please upload a clear, full-body photo." if w > h: return False, ( "Image appears wider than tall. " "Please upload a portrait-orientation photo (full body visible)." ) # T-pose images are naturally wider due to arms spread — no aspect ratio check. return True, "" def pil_to_rgb(image: Image.Image) -> Image.Image: """Ensure image is in RGB mode (handles RGBA, grayscale, etc.).""" return image.convert("RGB") def pil_to_numpy(image: Image.Image) -> np.ndarray: """PIL Image → uint8 numpy array (H, W, 3).""" return np.array(pil_to_rgb(image))