diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 1ee684926..9b6c0221c 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -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 diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 44270392c..99c8e7cc7 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -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.