41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
|
|
from __future__ import annotations
|
|
from dataclasses import dataclass
|
|
from typing import Dict, Optional
|
|
import numpy as np
|
|
from PIL import Image
|
|
|
|
from generators.gradient_generator import GradientGenerator
|
|
from generators.chessboard_generator import ChessboardGenerator
|
|
|
|
|
|
@dataclass
|
|
class GenerateMode:
|
|
"""CLI-режим генерации изображений: gradient/chess."""
|
|
|
|
def run(
|
|
self,
|
|
kind: str,
|
|
size: int,
|
|
channels: int,
|
|
output_path: str,
|
|
tile: Optional[int] = None,
|
|
) -> Dict[str, str]:
|
|
"""Сгенерировать изображение и сохранить в файл."""
|
|
if kind == "gradient":
|
|
arr = GradientGenerator.make(size=size, channels=channels)
|
|
elif kind == "chess":
|
|
t = 32 if tile is None else int(tile)
|
|
arr = ChessboardGenerator.make(size=size, channels=channels, tile=t)
|
|
else:
|
|
raise ValueError("kind должен быть 'gradient' или 'chess'.")
|
|
|
|
mode = "L" if channels == 1 else "RGB"
|
|
if arr.ndim == 2:
|
|
img = Image.fromarray(arr, mode=mode)
|
|
else:
|
|
img = Image.fromarray(arr.astype(np.uint8), mode=mode)
|
|
img.save(output_path)
|
|
|
|
return {"status": "ok", "kind": kind, "size": str(size), "channels": str(channels), "output": output_path}
|