Skip to content

GIF - use single colour table for all frames #3788

@Gadgetoid

Description

@Gadgetoid

What did you do?

Attempted to normalise a sequence of P images to use the same colour palette in an attempt to output a smaller GIF file that uses a common palette across all frames.

The complete code is here - https://github.com/pimoroni/mlx90640-library/blob/master/python/rgb-to-gif.py - but the relevant snippet can be found below:

    if len(frames) > 1:
        # Generate an image with all frames, and crunch it to ADAPTIVE to form a master colour palette
        master = Image.new('RGB', (32, 24 * len(frames)))
        for index, image in enumerate(frames):
            master.paste(image, (0, 24 * index))
        master = master.convert('P', dither=False, palette=Image.ADAPTIVE, colors=256)

        for index, image in enumerate(frames):
            image = image.convert('P', dither=False, palette=master.palette)
            # image = image.quantize(method=3, palette=master)
            image = image.transpose(Image.ROTATE_270).transpose(Image.FLIP_LEFT_RIGHT)
            image = image.resize(OUTPUT_SIZE, Image.NEAREST)
            frames[index] = image

        filename = 'mlx90640-{}.gif'.format(
            datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))
print("Saving {} with {} frames.".format(filename, len(frames)))

        frames[0].save(
            filename,
            save_all=True,
            append_images=frames[1:],
            duration=1000 // fps,
            loop=0,
            include_color_table=True,
            optimize=True,
palette=master.palette.getdata())

What did you expect to happen?

For the GIF format save method to understand that I was sharing a colour palette across frames, and export accordingly. There doesn't seem to be a way - that I can identify - to communicate this.

What actually happened?

Result a ~1.19MiB GIF:

mlx90640-2019-04-11-16-34-25

Versus a ~263.4KiB GIF - This is a ~70-80% size saving just running the result through ezgif (https://ezgif.com/optimize) optimisation and picking "Use single color table for all frames":

ezgif-4-917f7c76321e

Unless I am very much misunderstanding what ezgif is doing in this case, no other optimisation was performed.

What are your OS, Python and Pillow versions?

  • OS: Linux, Raspbia
  • Python: 3.4.9
  • Pillow: PIL.PILLOW_VERSION == 5.4.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions