20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
# File 'lib/flipbook.rb', line 20
def write(path, frames, fps: nil, delay: nil, loop: true, colors: 256, palette: :global, dither: :floyd_steinberg, optimize: true)
raise TypeError, "frames must be an array of Tessel::Image values" unless frames.is_a?(Array) && frames.all? { |frame| frame.is_a?(Tessel::Image) }
raise ArgumentError, "at least one frame is required" if frames.empty?
raise ArgumentError, "frame dimensions must match" unless frames.all? { |frame| frame.width == frames.first.width && frame.height == frames.first.height }
extension = File.extname(String(path)).downcase
raise ArgumentError, "output path must end in .gif, .png, or .apng" unless %w[.gif .png .apng].include?(extension)
delays = Timing.delays(frames.length, fps:, delay:, warn_short: extension == ".gif")
if extension == ".gif"
write_gif(path, frames, delays, loop:, colors:, palette:, dither:, optimize:)
else
APNG::Writer.open(path, width: frames.first.width, height: frames.first.height, loop:, optimize:) do |writer|
frames.zip(delays).each do |frame, frame_delay|
writer.add(frame, delay: frame_delay)
end
end
end
end
|