Skip to content

Commit 64d9661

Browse files
authored
Merge pull request #8237 from radarhere/gif_expand
2 parents 9308f11 + bdc53f6 commit 64d9661

File tree

3 files changed

+47
-8
lines changed

3 files changed

+47
-8
lines changed
415 Bytes
Loading

Tests/test_file_gif.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,16 +1378,37 @@ def test_lzw_bits() -> None:
13781378
im.load()
13791379

13801380

1381-
def test_extents() -> None:
1382-
with Image.open("Tests/images/test_extents.gif") as im:
1383-
assert im.size == (100, 100)
1381+
@pytest.mark.parametrize(
1382+
"test_file, loading_strategy",
1383+
(
1384+
("test_extents.gif", GifImagePlugin.LoadingStrategy.RGB_AFTER_FIRST),
1385+
(
1386+
"test_extents.gif",
1387+
GifImagePlugin.LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY,
1388+
),
1389+
(
1390+
"test_extents_transparency.gif",
1391+
GifImagePlugin.LoadingStrategy.RGB_AFTER_FIRST,
1392+
),
1393+
),
1394+
)
1395+
def test_extents(test_file, loading_strategy) -> None:
1396+
GifImagePlugin.LOADING_STRATEGY = loading_strategy
1397+
try:
1398+
with Image.open("Tests/images/" + test_file) as im:
1399+
assert im.size == (100, 100)
13841400

1385-
# Check that n_frames does not change the size
1386-
assert im.n_frames == 2
1387-
assert im.size == (100, 100)
1401+
# Check that n_frames does not change the size
1402+
assert im.n_frames == 2
1403+
assert im.size == (100, 100)
13881404

1389-
im.seek(1)
1390-
assert im.size == (150, 150)
1405+
im.seek(1)
1406+
assert im.size == (150, 150)
1407+
1408+
im.load()
1409+
assert im.im.size == (150, 150)
1410+
finally:
1411+
GifImagePlugin.LOADING_STRATEGY = GifImagePlugin.LoadingStrategy.RGB_AFTER_FIRST
13911412

13921413

13931414
def test_missing_background() -> None:

src/PIL/GifImagePlugin.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,13 @@ def load_prepare(self) -> None:
438438
self.im.putpalette("RGB", *self._frame_palette.getdata())
439439
else:
440440
self._im = None
441+
if not self._prev_im and self._im is not None and self.size != self.im.size:
442+
expanded_im = Image.core.fill(self.im.mode, self.size)
443+
if self._frame_palette:
444+
expanded_im.putpalette("RGB", *self._frame_palette.getdata())
445+
expanded_im.paste(self.im, (0, 0) + self.im.size)
446+
447+
self.im = expanded_im
441448
self._mode = temp_mode
442449
self._frame_palette = None
443450

@@ -455,6 +462,17 @@ def load_end(self) -> None:
455462
return
456463
if not self._prev_im:
457464
return
465+
if self.size != self._prev_im.size:
466+
if self._frame_transparency is not None:
467+
expanded_im = Image.core.fill("RGBA", self.size)
468+
else:
469+
expanded_im = Image.core.fill("P", self.size)
470+
expanded_im.putpalette("RGB", "RGB", self.im.getpalette())
471+
expanded_im = expanded_im.convert("RGB")
472+
expanded_im.paste(self._prev_im, (0, 0) + self._prev_im.size)
473+
474+
self._prev_im = expanded_im
475+
assert self._prev_im is not None
458476
if self._frame_transparency is not None:
459477
self.im.putpalettealpha(self._frame_transparency, 0)
460478
frame_im = self.im.convert("RGBA")

0 commit comments

Comments
 (0)