diff --git a/imageio/plugins/pillow.py b/imageio/plugins/pillow.py index 26eb19492..f44e2d6c4 100644 --- a/imageio/plugins/pillow.py +++ b/imageio/plugins/pillow.py @@ -34,7 +34,7 @@ from typing import Any, Callable, Dict, Iterator, List, Optional, Tuple, Union, cast import numpy as np -from PIL import ExifTags, Image, ImageSequence, UnidentifiedImageError # type: ignore +from PIL import ExifTags, GifImagePlugin, Image, ImageSequence, UnidentifiedImageError # type: ignore from ..core.request import URI_BYTES, InitializationError, IOMode, Request from ..core.v3_plugin_api import ImageProperties, PluginV3 @@ -210,6 +210,13 @@ def read( " `mode='L'` for an integer-valued result." ) + if self._image.format == "GIF": + # Converting GIF P frames to RGB + # https://github.com/python-pillow/Pillow/pull/6150 + GifImagePlugin.LOADING_STRATEGY = ( + GifImagePlugin.LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY + ) + if index is None: if self._image.format == "GIF": index = Ellipsis diff --git a/tests/test_pillow.py b/tests/test_pillow.py index 0453f90c3..90d56ccf0 100644 --- a/tests/test_pillow.py +++ b/tests/test_pillow.py @@ -360,6 +360,17 @@ def test_gif_list_write(test_images, tmp_path): assert im2.shape == (24, 30, 3) +@pytest.mark.needs_internet +def test_gif_first_p_frame(): + # Bugfix: https://github.com/imageio/imageio/issues/1030 + im = iio.imread( + "https://upload.wikimedia.org/wikipedia/commons/d/d3/Newtons_cradle_animation_book_2.gif", + plugin="pillow", + index=None, + ) + assert im.shape == (36, 360, 480, 3) + + def test_legacy_exif_orientation(test_images, tmp_path): from PIL.Image import Exif