frames.py
2.4 kB · python · 64 lines
1from mrlypy.core.enums import Mode2from PIL import Image3import numpy as np4import os5from colors import PRIMARIES, SECONDARIES, create_frames_colors6from config import FLASHES, FLASH_CONWAY, FORMAT7from enums import Way8from models import Saga, Task910# FRAMES1112def frame_path(output_dir: str, key: str, index: int) -> str:13 return f"{output_dir}/{key}_{index:03d}.{FORMAT}"1415def create_saga_frames(saga: Saga, output_dir: str) -> Saga:16 os.makedirs(output_dir, exist_ok=True)17 boundary = saga.boundary.value18 cursor = 019 for seg, seg_len in zip(saga.segments, saga.segment_lengths):20 k = int(np.sum(seg.mask.cell.types)) + 121 primary, secondary = create_frames_colors(seg, k)22 params = ({0: [primary], 1: secondary}, Mode.TAG)23 mask_types = seg.mask.cell.types24 for i, grid in enumerate(saga.grids[cursor:cursor + seg_len]):25 grid.neighbors(mask_types, mode=boundary)26 grid.paint(*params)27 image = grid.to_image(1).convert("RGB")28 image.save(frame_path(output_dir, saga.key, cursor + i + 1), format=FORMAT)29 cursor += seg_len30 print(f"frames {len(saga.grids)} -> {output_dir}")31 return saga3233# MASKS3435def flash_count(seg: Task) -> int:36 if seg.way == Way.CONWAY and not FLASH_CONWAY:37 return 038 return FLASHES3940def mask_path(output_dir: str, key: str, index: int) -> str:41 return f"{output_dir}/{key}_mask_{index:02d}.{FORMAT}"4243def create_saga_masks(saga: Saga, output_dir: str) -> Saga:44 os.makedirs(output_dir, exist_ok=True)45 size = saga.grids[0].types.shape[0]46 for index, seg in enumerate(saga.segments):47 mask = seg.mask.cell.types48 m = mask.shape[0]49 offset = (size - m) // 250 canvas = np.zeros((size, size, 4), dtype=np.uint8)51 canvas[:, :, :] = PRIMARIES[seg.primary].to_rgba()52 color = np.array(SECONDARIES[seg.secondary].to_rgba(), dtype=np.uint8)53 window = canvas[offset:offset + m, offset:offset + m]54 window[mask == 1] = color55 Image.fromarray(canvas, "RGBA").convert("RGB").save(mask_path(output_dir, saga.key, index), format=FORMAT)56 print(f"masks {len(saga.segments)} -> {output_dir}")57 return saga5859# POSTER6061def create_saga_poster(source: str, path: str, size: int) -> str:62 Image.open(source).convert("RGB").resize((size, size), Image.NEAREST).save(path, format="WEBP", lossless=True)63 print(f"poster {source} -> {path}")64 return path