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:

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":

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
What did you do?
Attempted to normalise a sequence of
Pimages 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:
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:
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":
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?