from pathlib import Path import numpy as np from PIL import Image, ImageDraw SUPPORTED_IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".bmp", ".webp"} class ImageState: def __init__(self, assets_dir: str = "assets"): self.assets_dir = Path(assets_dir) self.image_paths = self._load_image_paths() self.index = 0 def _load_image_paths(self): if not self.assets_dir.exists(): return [] paths = [] for path in sorted(self.assets_dir.iterdir()): if path.suffix.lower() in SUPPORTED_IMAGE_EXTENSIONS: paths.append(path) return paths def next_image(self): if not self.image_paths: return None self.index = (self.index + 1) % len(self.image_paths) return self.image_paths[self.index] def prev_image(self): if not self.image_paths: return None self.index = (self.index - 1) % len(self.image_paths) return self.image_paths[self.index] def first_image(self): if not self.image_paths: return None self.index = 0 return self.image_paths[self.index] def last_image(self): if not self.image_paths: return None self.index = len(self.image_paths) - 1 return self.image_paths[self.index] def get_current_image(self): if not self.image_paths: return self._create_placeholder_image() image = Image.open(self.image_paths[self.index]).convert("RGB") return np.array(image) def _create_placeholder_image(self): image = Image.new("RGB", (640, 360), color=(40, 40, 40)) draw = ImageDraw.Draw(image) draw.text((20, 20), "No images in assets/", fill=(255, 255, 255)) return np.array(image)