diff --git a/Tests/images/sugarshack_frame_size.mpo b/Tests/images/sugarshack_frame_size.mpo new file mode 100644 index 00000000000..81d58e64b82 Binary files /dev/null and b/Tests/images/sugarshack_frame_size.mpo differ diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index 45172472a0a..aab13ce388e 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -55,6 +55,15 @@ def test_exif(self): self.assertEqual(info[296], 2) self.assertEqual(info[34665], 188) + def test_frame_size(self): + # This image has been hexedited to contain a different size + # in the EXIF data of the second frame + im = Image.open("Tests/images/sugarshack_frame_size.mpo") + self.assertEqual(im.size, (640, 480)) + + im.seek(1) + self.assertEqual(im.size, (680, 480)) + def test_mp(self): for test_file in test_files: im = Image.open(test_file) diff --git a/src/PIL/MpoImagePlugin.py b/src/PIL/MpoImagePlugin.py index 64c0f57a489..44ce3922cbf 100644 --- a/src/PIL/MpoImagePlugin.py +++ b/src/PIL/MpoImagePlugin.py @@ -18,7 +18,8 @@ # See the README file for information on usage and redistribution. # -from . import Image, JpegImagePlugin +from . import Image, ImageFile, JpegImagePlugin +from ._binary import i16be as i16 # __version__ is deprecated and will be removed in a future version. Use # PIL.__version__ instead. @@ -78,6 +79,20 @@ def seek(self, frame): return self.fp = self.__fp self.offset = self.__mpoffsets[frame] + + self.fp.seek(self.offset + 2) # skip SOI marker + if "parsed_exif" in self.info: + del self.info["parsed_exif"] + if i16(self.fp.read(2)) == 0xFFE1: # APP1 + n = i16(self.fp.read(2))-2 + self.info["exif"] = ImageFile._safe_read(self.fp, n) + + exif = self._getexif() + if 40962 in exif and 40963 in exif: + self._size = (exif[40962], exif[40963]) + elif "exif" in self.info: + del self.info["exif"] + self.tile = [ ("jpeg", (0, 0) + self.size, self.offset, (self.mode, "")) ]