4

I can create an animated GIF like this:

from wand.image import Image

with Image() as im:
    while i_need_to_add_more_frames():
        im.sequence.append(Image(blob=get_frame_data(), format='png'))
        with im.sequence[-1] as frame:
            frame.delay = calculate_how_long_this_frame_should_be_visible()
    im.type = 'optimize'
    im.format = 'gif'
    do_something_with(im.make_blob())

However, an image created like this loops indefinitely. This time, I want it to loop once, and then stop. I know that I could use convert's -loop parameter if I were using the commandline interface. However, I was unable to find how to do this using the Wand API.

What method should I call, or what field should I set, to make the generated GIF loop exactly once?

Aran-Fey
  • 39,665
  • 11
  • 104
  • 149
Maya
  • 1,490
  • 12
  • 24

1 Answers1

0

You'll need to use ctypes to bind the wand library to the correct C-API method. Luckily this is straightforward.

import ctypes
from wand.image import Image
from wand.api import library

# Tell Python about the C-API method.
library.MagickSetImageIterations.argtypes = (ctypes.c_void_p, ctypes.c_size_t)

with Image() as im:
    while i_need_to_add_more_frames():
        im.sequence.append(Image(blob=get_frame_data(), format='png'))
        with im.sequence[-1] as frame:
            frame.delay = calculate_how_long_this_frame_should_be_visible()
    im.type = 'optimize'
    im.format = 'gif'
    # Set the total iterations of the animation.
    library.MagickSetImageIterations(im.wand, 1)
    do_something_with(im.make_blob())
emcconville
  • 23,800
  • 4
  • 50
  • 66