Merge pull request #6592 from radarhere/gif_rgba

This commit is contained in:
Hugo van Kemenade 2022-10-12 12:47:38 +02:00 committed by GitHub
commit cf3132b7de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 14 deletions

View File

@ -84,17 +84,24 @@ def test_l_mode_transparency():
def test_strategy(): def test_strategy():
with Image.open("Tests/images/iss634.gif") as im:
expected_rgb_always = im.convert("RGB")
with Image.open("Tests/images/chi.gif") as im: with Image.open("Tests/images/chi.gif") as im:
expected_zero = im.convert("RGB") expected_rgb_always_rgba = im.convert("RGBA")
im.seek(1) im.seek(1)
expected_one = im.convert("RGB") expected_different = im.convert("RGB")
try: try:
GifImagePlugin.LOADING_STRATEGY = GifImagePlugin.LoadingStrategy.RGB_ALWAYS GifImagePlugin.LOADING_STRATEGY = GifImagePlugin.LoadingStrategy.RGB_ALWAYS
with Image.open("Tests/images/chi.gif") as im: with Image.open("Tests/images/iss634.gif") as im:
assert im.mode == "RGB" assert im.mode == "RGB"
assert_image_equal(im, expected_zero) assert_image_equal(im, expected_rgb_always)
with Image.open("Tests/images/chi.gif") as im:
assert im.mode == "RGBA"
assert_image_equal(im, expected_rgb_always_rgba)
GifImagePlugin.LOADING_STRATEGY = ( GifImagePlugin.LOADING_STRATEGY = (
GifImagePlugin.LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY GifImagePlugin.LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY
@ -105,7 +112,7 @@ def test_strategy():
im.seek(1) im.seek(1)
assert im.mode == "P" assert im.mode == "P"
assert_image_equal(im.convert("RGB"), expected_one) assert_image_equal(im.convert("RGB"), expected_different)
# Change to RGB mode when a frame has an individual palette # Change to RGB mode when a frame has an individual palette
with Image.open("Tests/images/iss634.gif") as im: with Image.open("Tests/images/iss634.gif") as im:

View File

@ -299,11 +299,13 @@ class GifImageFile(ImageFile.ImageFile):
self.im.paste(self.dispose, self.dispose_extent) self.im.paste(self.dispose, self.dispose_extent)
self._frame_palette = palette or self.global_palette self._frame_palette = palette or self.global_palette
self._frame_transparency = frame_transparency
if frame == 0: if frame == 0:
if self._frame_palette: if self._frame_palette:
self.mode = ( if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS:
"RGB" if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS else "P" self.mode = "RGBA" if frame_transparency is not None else "RGB"
) else:
self.mode = "P"
else: else:
self.mode = "L" self.mode = "L"
@ -313,7 +315,6 @@ class GifImageFile(ImageFile.ImageFile):
palette = copy(self.global_palette) palette = copy(self.global_palette)
self.palette = palette self.palette = palette
else: else:
self._frame_transparency = frame_transparency
if self.mode == "P": if self.mode == "P":
if ( if (
LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY
@ -386,7 +387,8 @@ class GifImageFile(ImageFile.ImageFile):
transparency = -1 transparency = -1
if frame_transparency is not None: if frame_transparency is not None:
if frame == 0: if frame == 0:
self.info["transparency"] = frame_transparency if LOADING_STRATEGY != LoadingStrategy.RGB_ALWAYS:
self.info["transparency"] = frame_transparency
elif self.mode not in ("RGB", "RGBA"): elif self.mode not in ("RGB", "RGBA"):
transparency = frame_transparency transparency = frame_transparency
self.tile = [ self.tile = [
@ -410,9 +412,9 @@ class GifImageFile(ImageFile.ImageFile):
temp_mode = "P" if self._frame_palette else "L" temp_mode = "P" if self._frame_palette else "L"
self._prev_im = None self._prev_im = None
if self.__frame == 0: if self.__frame == 0:
if "transparency" in self.info: if self._frame_transparency is not None:
self.im = Image.core.fill( self.im = Image.core.fill(
temp_mode, self.size, self.info["transparency"] temp_mode, self.size, self._frame_transparency
) )
elif self.mode in ("RGB", "RGBA"): elif self.mode in ("RGB", "RGBA"):
self._prev_im = self.im self._prev_im = self.im
@ -429,8 +431,12 @@ class GifImageFile(ImageFile.ImageFile):
def load_end(self): def load_end(self):
if self.__frame == 0: if self.__frame == 0:
if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS:
self.mode = "RGB" if self._frame_transparency is not None:
self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG) self.im.putpalettealpha(self._frame_transparency, 0)
self.mode = "RGBA"
else:
self.mode = "RGB"
self.im = self.im.convert(self.mode, Image.Dither.FLOYDSTEINBERG)
return return
if self.mode == "P" and self._prev_im: if self.mode == "P" and self._prev_im:
if self._frame_transparency is not None: if self._frame_transparency is not None: