diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 4921f0a37..abf9db7e3 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -448,7 +448,11 @@ class ImageFileDirectory(collections.MutableMapping): # Get and expand tag value if size > 4: here = fp.tell() + if Image.DEBUG: + print ("Tag Location: %s" %here) fp.seek(i32(ifd, 8)) + if Image.DEBUG: + print ("Data Location: %s" %fp.tell()) data = ImageFile._safe_read(fp, size) fp.seek(here) else: @@ -632,18 +636,20 @@ class TiffImageFile(ImageFile.ImageFile): def seek(self, frame): "Select a given frame as current image" - if frame < 0: frame = 0 self._seek(frame) + # Create a new core image object on second and + # subsequent frames in the image. Image may be + # different size/mode. + Image._decompression_bomb_check(self.size) + self.im = Image.core.new(self.mode, self.size) def tell(self): "Return the current frame number" - return self._tell() def _seek(self, frame): - self.fp = self.__fp if frame < self.__frame: # rewind file @@ -652,16 +658,18 @@ class TiffImageFile(ImageFile.ImageFile): while self.__frame < frame: if not self.__next: raise EOFError("no more images in TIFF file") + if Image.DEBUG: + print("Seeking to frame %s, on frame %s, __next %s, location: %s"% + (frame, self.__frame, self.__next, self.fp.tell())) self.fp.seek(self.__next) + if Image.DEBUG: + print("Loading tags, location: %s"%self.fp.tell()) self.tag.load(self.fp) self.__next = self.tag.next self.__frame += 1 self._setup() - #UNDONE - decompresion bomb - self.im = Image.core.new(self.mode, self.size) def _tell(self): - return self.__frame def _decoder(self, rawmode, layer, tile=None): diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 121ad5de2..bdac5f300 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -332,7 +332,7 @@ class TestFileLibTiff(LibTiffTestCase): self.assertFalse(im.tag.next) self.assertEqual(im.size, (20,20)) self.assertEqual(im.convert('RGB').getpixel((0,0)), (0,0,255)) - + TiffImagePlugin.READ_LIBTIFF = False def test__next(self): diff --git a/Tests/test_imagesequence.py b/Tests/test_imagesequence.py index 2470bc732..068290451 100644 --- a/Tests/test_imagesequence.py +++ b/Tests/test_imagesequence.py @@ -22,15 +22,19 @@ class TestImageSequence(PillowTestCase): self.assertEqual(index, 1) - def _test_multipage_tiff(self): + def _test_multipage_tiff(self, dbg=False): + # debug had side effect of calling fp.tell. + Image.DEBUG=dbg im = Image.open('Tests/images/multipage.tiff') for index, frame in enumerate(ImageSequence.Iterator(im)): frame.load() self.assertEqual(index, im.tell()) frame.convert('RGB') + Image.DEBUG=False def test_tiff(self): - return self._test_multipage_tiff() + #self._test_multipage_tiff(True) + self._test_multipage_tiff(False) def test_libtiff(self): codecs = dir(Image.core) @@ -39,7 +43,8 @@ class TestImageSequence(PillowTestCase): self.skipTest("tiff support not available") TiffImagePlugin.READ_LIBTIFF = True - self._test_multipage_tiff() + #self._test_multipage_tiff(True) + self._test_multipage_tiff(False) TiffImagePlugin.READ_LIBTIFF = False if __name__ == '__main__':