Files
OmniLottie/lottie/importers/raster.py
T

73 lines
2.9 KiB
Python
Raw Normal View History

2026-03-01 21:36:54 +08:00
from .base import importer
from ..parsers.baseporter import ExtraOption
from ..parsers.pixel import (
pixel_to_animation_paths, pixel_to_animation,
raster_to_embedded_assets, raster_to_linked_assets
)
from ..parsers.svg.importer import parse_color
try:
from ..parsers.raster import raster_to_animation
raster = True
except ImportError:
raster = False
@importer("Raster image", ["bmp", "png", "gif", "webp", "tiff"], [
ExtraOption("n_colors", type=int, default=1, help="Number of colors to quantize"),
ExtraOption("palette", type=parse_color, default=[], nargs="+", help="Custom palette"),
ExtraOption(
"mode",
default="embed",
choices=["external", "embed", "pixel", "polygon"] + (["trace"] if raster else []),
help="Vectorization mode:\n" +
" * external : load images as linked assets\n" +
" * embed : load images as embedded assets\n" +
" * pixel : Vectorize the image into rectangles\n" +
" * polygon : Vectorize the image into polygonal shapes\n" +
" Looks the same as pixel, but a single shape per color\n" +
" * trace : (if available) Use potrace to vectorize\n"
),
ExtraOption("frame_delay", type=int, default=4, help="Number of frames to skip between images"),
ExtraOption("framerate", type=int, default=60, help="Frames per second"),
ExtraOption("frame_files", nargs="+", default=[], help="Additional frames to import"),
ExtraOption(
"color_mode",
default="nearest",
choices=["nearest", "exact"],
help="How to quantize colors.\n" +
" * nearest will map each color to the most similar in the palette\n" +
" * exact will only match exact colors"
),
ExtraOption(
"embed_format",
default=None,
help="Format to store images internally when using `embed` mode"
),
])
def import_raster(filenames, n_colors, palette, mode, frame_delay=1,
framerate=60, frame_files=[], color_mode="nearest", embed_format=None):
if not isinstance(filenames, list):
filenames = [filenames]
filenames = filenames + frame_files
if mode == "embed":
return raster_to_embedded_assets(filenames, frame_delay, framerate, embed_format)
elif mode == "external":
return raster_to_linked_assets(filenames, frame_delay, framerate)
elif mode == "trace":
from ..parsers.raster import QuanzationMode
# TODO QuanzationMode for raster
cm = QuanzationMode.Nearest if color_mode == "nearest" else QuanzationMode.Exact
return raster_to_animation(
filenames, n_colors, frame_delay,
framerate=framerate,
palette=palette,
mode=cm
)
elif mode == "polygon":
return pixel_to_animation_paths(filenames, frame_delay, framerate)
else:
return pixel_to_animation(filenames, frame_delay, framerate)