TheBird

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