From 1d77bfe9d939e208e3bb2b897a4209c0881eb9f1 Mon Sep 17 00:00:00 2001 From: Aleksandr Karpinskii Date: Mon, 12 Aug 2024 14:49:01 +0400 Subject: [PATCH] Tiff: report correct image size after opening --- src/PIL/TiffImagePlugin.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 9ebf2125f7d..11ca798672b 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1122,8 +1122,8 @@ def seek(self, 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) + Image._decompression_bomb_check(self._tile_size) + self.im = Image.core.new(self.mode, self._tile_size) def _seek(self, frame): self.fp = self._fp @@ -1202,6 +1202,12 @@ def load(self): return self._load_libtiff() return super().load() + def load_prepare(self): + # Restore self.size during image allocation + self._size, old_size = self._tile_size, self._size + super().load_prepare() + self._size = old_size + def load_end(self): if self._tile_orientation: method = { @@ -1354,10 +1360,16 @@ def _setup(self): logger.debug(f"- fill_order: {fillorder}") logger.debug(f"- YCbCr subsampling: {self.tag.get(YCBCRSUBSAMPLING)}") + self._tile_orientation = self.tag_v2.get(0x0112) + # size xsize = int(self.tag_v2.get(IMAGEWIDTH)) ysize = int(self.tag_v2.get(IMAGELENGTH)) - self._size = xsize, ysize + self._tile_size = xsize, ysize + if self._tile_orientation in (5, 6, 7, 8): + self._size = ysize, xsize + else: + self._size = xsize, ysize logger.debug(f"- size: {self.size}") @@ -1500,7 +1512,7 @@ def _setup(self): if STRIPOFFSETS in self.tag_v2: offsets = self.tag_v2[STRIPOFFSETS] h = self.tag_v2.get(ROWSPERSTRIP, ysize) - w = self.size[0] + w = xsize else: # tiled image offsets = self.tag_v2[TILEOFFSETS] @@ -1530,9 +1542,9 @@ def _setup(self): ) ) x = x + w - if x >= self.size[0]: + if x >= xsize: x, y = 0, y + h - if y >= self.size[1]: + if y >= ysize: x = y = 0 layer += 1 else: @@ -1550,9 +1562,6 @@ def _setup(self): palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) - self._tile_orientation = self.tag_v2.get(0x0112) - - # # -------------------------------------------------------------------- # Write TIFF files