Module: Flipbook

Defined in:
lib/flipbook.rb,
lib/flipbook/diff.rb,
lib/flipbook/output.rb,
lib/flipbook/timing.rb,
lib/flipbook/gif/lzw.rb,
lib/flipbook/version.rb,
lib/flipbook/gif/reader.rb,
lib/flipbook/gif/writer.rb,
lib/flipbook/apng/writer.rb,
lib/flipbook/gif/bit_writer.rb,
sig/flipbook.rbs

Defined Under Namespace

Modules: APNG, Diff, GIF, Output, Timing Classes: Error

Constant Summary collapse

VERSION =

Returns:

  • (String)
"0.4.1"

Class Method Summary collapse

Class Method Details

.read(path, **options) ⇒ Array[Tessel::Image]

Parameters:

  • path (String)
  • max_pixels: (Integer)
  • max_frames: (Integer)
  • max_total_pixels: (Integer)

Returns:



40
41
42
# File 'lib/flipbook.rb', line 40

def read(path, **options)
  GIF::Reader.read(path, **options)
end

.write(path, frames, fps: nil, delay: nil, loop: true, colors: 256, palette: :global, dither: :floyd_steinberg, optimize: true) ⇒ String

Parameters:

  • path (String)
  • frames (Array[Tessel::Image])
  • fps: (Numeric, nil) (defaults to: nil)
  • delay: (Numeric, Array[Numeric], nil) (defaults to: nil)
  • loop: (bool, Integer) (defaults to: true)
  • colors: (Integer) (defaults to: 256)
  • palette: (Symbol, Array[[Integer, Integer, Integer]]) (defaults to: :global)
  • dither: (Symbol) (defaults to: :floyd_steinberg)
  • optimize: (Boolean) (defaults to: true)

Returns:

  • (String)

Raises:

  • (TypeError)


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