mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-26 09:56:17 +03:00
Merge pull request #6592 from radarhere/gif_rgba
This commit is contained in:
commit
cf3132b7de
|
@ -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:
|
||||||
|
|
|
@ -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,6 +387,7 @@ 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:
|
||||||
|
if LOADING_STRATEGY != LoadingStrategy.RGB_ALWAYS:
|
||||||
self.info["transparency"] = frame_transparency
|
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
|
||||||
|
@ -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:
|
||||||
|
if self._frame_transparency is not None:
|
||||||
|
self.im.putpalettealpha(self._frame_transparency, 0)
|
||||||
|
self.mode = "RGBA"
|
||||||
|
else:
|
||||||
self.mode = "RGB"
|
self.mode = "RGB"
|
||||||
self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG)
|
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:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user