# Standard library imports. from pathlib import Path # External library imports. from PIL import Image # Django imports. from django.conf import settings ########################################################################################### # Constants. # ########################################################################################### THUMB_SIZE = (128, 128) # Supported image extensions for fast file filtering (avoids costly MIME-type detection) IMAGE_EXTENSIONS = {'.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.tiff', '.tif', '.svg'} ########################################################################################### # Helper functions. # ########################################################################################### def is_image_file(path): """ Fast image detection using file extension instead of MIME-type checking. :param path: A pathlib.Path instance or string path to check. :return: True if the file extension matches a known image format. """ if isinstance(path, str): path = Path(path) return path.suffix.lower() in IMAGE_EXTENSIONS def make_thumbnail(image): """ Creates a thumbnail in the corresponding THUMBNAILS_ROOT directory for the given image. :param image: A pathlib.Path instance pointing to a file inside the GALLERY_ROOT directory. """ if image.exists(): thumb_path = Path(str(image).replace(str(settings.GALLERY_ROOT), str(settings.THUMBNAILS_ROOT))) thumb_path.parent.mkdir(parents = True, exist_ok = True) if not thumb_path.exists(): try: with Image.open(str(image)) as pilimg: pilimg.thumbnail(THUMB_SIZE) pilimg.save(str(thumb_path)) except Exception: pass