In Image.Image.seek(), clear core image if mode or size has changed

This commit is contained in:
Andrew Murray 2024-10-08 21:17:51 +11:00
parent 949079bf36
commit e8ef3009e3
2 changed files with 36 additions and 1 deletions

View File

@ -428,3 +428,32 @@ class TestPyEncoder(CodecsTest):
def test_zero_height(self) -> None:
with pytest.raises(UnidentifiedImageError):
Image.open("Tests/images/zero_height.j2k")
def test_load_prepare(self):
class TestImageFile(ImageFile.ImageFile):
def _open(self) -> None:
self._mode = "1"
self._size = (1, 1)
self._frame = 0
def seek(self, frame: int) -> None:
self._mode = "L"
self._size = (2, 2)
self._frame = frame
super().seek(frame)
def tell(self) -> int:
return self._frame
fp = BytesIO()
im = TestImageFile(fp)
im.load_prepare()
assert im._im is not None
im.seek(1)
assert im._im is None
im.load_prepare()
assert im._im is not None
assert im._im.mode == im.mode
assert im._im.size == im.size

View File

@ -2633,10 +2633,16 @@ class Image:
"""
# overridden by file handlers
if frame != 0:
if frame != self.tell():
# The file handler likely did not override this method
msg = "no more images in file"
raise EOFError(msg)
if self._im is not None and (
self.im.size != self.size or self.im.mode != self.mode
):
self._im = None
def show(self, title: str | None = None) -> None:
"""
Displays this image. This method is mainly intended for debugging purposes.