diff --git a/Tests/test_image.py b/Tests/test_image.py index 330048057..19e64d746 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -532,6 +532,18 @@ class TestImage(PillowTestCase): with Image.open(test_file) as im: self.assert_warning(None, im.save, temp_file) + def test_load_on_nonexclusive_multiframe(self): + with open("Tests/images/frozenpond.mpo", "rb") as fp: + def act(fp): + im = Image.open(fp) + im.load() + act(fp) + + with Image.open(fp) as im: + im.load() + + self.assertFalse(fp.closed) + class MockEncoder(object): pass diff --git a/src/PIL/Image.py b/src/PIL/Image.py index c77a4cfe2..4626497fb 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -578,11 +578,11 @@ class Image(object): return self def __exit__(self, *args): - if hasattr(self, "_close__fp"): - self._close__fp() - if (hasattr(self, 'fp') and hasattr(self, '_exclusive_fp') - and self.fp and self._exclusive_fp): - self.fp.close() + if hasattr(self, 'fp') and getattr(self, '_exclusive_fp', False): + if hasattr(self, "_close__fp"): + self._close__fp() + if self.fp: + self.fp.close() self.fp = None def close(self): diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 212e6b4c7..25557326b 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -186,7 +186,7 @@ def _save_all(im, fp, filename): # will preserve non-alpha modes total = 0 for ims in [im]+append_images: - total += 1 if not hasattr(ims, "n_frames") else ims.n_frames + total += getattr(ims, "n_frames", 1) if total == 1: _save(im, fp, filename) return @@ -254,10 +254,7 @@ def _save_all(im, fp, filename): try: for ims in [im]+append_images: # Get # of frames in this image - if not hasattr(ims, "n_frames"): - nfr = 1 - else: - nfr = ims.n_frames + nfr = getattr(ims, "n_frames", 1) for idx in range(nfr): ims.seek(idx)