42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
"""
|
|
Exporter for IMAGE values (numpy arrays, ImageData annotation sources).
|
|
|
|
Images are raw pixel arrays — no physical calibration by design — so none of
|
|
the formats here round-trip dimensions. PNG/TIFF convert to uint8 via the
|
|
same image_to_uint8 helper the preview pipeline uses; NPZ preserves the raw
|
|
array.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
import numpy as np
|
|
|
|
from backend.data_types import image_to_uint8
|
|
from backend.exporters._base import FormatSpec
|
|
|
|
accepted_types: tuple[str, ...] = ("IMAGE", "ANNOTATION_SOURCE")
|
|
|
|
FORMATS: dict[str, FormatSpec] = {
|
|
"PNG": FormatSpec(ext=".png", round_trip=False, label="PNG"),
|
|
"TIFF": FormatSpec(ext=".tiff", round_trip=False, label="TIFF"),
|
|
"NPZ": FormatSpec(ext=".npz", round_trip=False, label="NumPy (.npz)"),
|
|
}
|
|
|
|
|
|
def save(path: Path, value: np.ndarray, format_name: str, **_opts) -> None:
|
|
arr = np.asarray(value)
|
|
if format_name == "PNG":
|
|
from PIL import Image
|
|
Image.fromarray(image_to_uint8(arr)).save(str(path))
|
|
return
|
|
if format_name == "TIFF":
|
|
import tifffile
|
|
tifffile.imwrite(str(path), image_to_uint8(arr))
|
|
return
|
|
if format_name == "NPZ":
|
|
np.savez(str(path), image=arr)
|
|
return
|
|
raise ValueError(f"Format {format_name!r} is not supported for IMAGE.")
|