From fc7319318e4fb50503de2dc0d4d8ba2bdc29bbb2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Mar 2022 09:23:12 +1100 Subject: [PATCH 1/2] Added BigTIFF reading --- Tests/images/hopper_bigtiff.tif | Bin 0 -> 49665 bytes Tests/test_file_tiff.py | 4 ++++ src/PIL/Image.py | 13 ++++++++++--- src/PIL/TiffImagePlugin.py | 33 ++++++++++++++++++++++++++------ src/PIL/TiffTags.py | 1 + 5 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 Tests/images/hopper_bigtiff.tif diff --git a/Tests/images/hopper_bigtiff.tif b/Tests/images/hopper_bigtiff.tif new file mode 100644 index 0000000000000000000000000000000000000000..9588a37d80bfe1cd41e7b08105fcf536be16542d GIT binary patch literal 49665 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 28aeff075cb..d8d5753f6db 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -87,6 +87,10 @@ def test_mac_tiff(self): assert_image_similar_tofile(im, "Tests/images/pil136.png", 1) + def test_bigtiff(self): + with Image.open("Tests/images/hopper_bigtiff.tif") as im: + assert_image_equal_tofile(im, "Tests/images/hopper.tif") + @pytest.mark.parametrize( "file_name,mode,size,offset", [ diff --git a/src/PIL/Image.py b/src/PIL/Image.py index c9265b5ab62..4ef42af3349 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -49,7 +49,7 @@ # PILLOW_VERSION was removed in Pillow 9.0.0. # Use __version__ instead. from . import ImageMode, TiffTags, UnidentifiedImageError, __version__, _plugins -from ._binary import i32le +from ._binary import i32le, o32be, o32le from ._util import deferred_error, isPath @@ -1416,6 +1416,7 @@ def getexif(self): "".join(self.info["Raw profile type exif"].split("\n")[3:]) ) elif hasattr(self, "tag_v2"): + self._exif.bigtiff = self.tag_v2._bigtiff self._exif.endian = self.tag_v2._endian self._exif.load_from_fp(self.fp, self.tag_v2._offset) if exif_info is not None: @@ -3423,6 +3424,7 @@ def _apply_env_variables(env=None): class Exif(MutableMapping): endian = None + bigtiff = False def __init__(self): self._data = {} @@ -3458,10 +3460,15 @@ def _get_ifd_dict(self, offset): return self._fixup_dict(info) def _get_head(self): + version = b"\x2B" if self.bigtiff else b"\x2A" if self.endian == "<": - return b"II\x2A\x00\x08\x00\x00\x00" + head = b"II" + version + b"\x00" + o32le(8) else: - return b"MM\x00\x2A\x00\x00\x00\x08" + head = b"MM\x00" + version + o32be(8) + if self.bigtiff: + head += o32le(8) if self.endian == "<" else o32be(8) + head += b"\x00\x00\x00\x00" + return head def load(self, data): # Extract EXIF information. This is highly experimental, diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 35ff1c1bbf7..e5d1b915b0c 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -260,6 +260,8 @@ b"II\x2A\x00", # Valid TIFF header with little-endian byte order b"MM\x2A\x00", # Invalid TIFF header, assume big-endian b"II\x00\x2A", # Invalid TIFF header, assume little-endian + b"MM\x00\x2B", # BigTIFF with big-endian byte order + b"II\x2B\x00", # BigTIFF with little-endian byte order ] @@ -502,11 +504,14 @@ def __init__(self, ifh=b"II\052\0\0\0\0\0", prefix=None, group=None): self._endian = "<" else: raise SyntaxError("not a TIFF IFD") + self._bigtiff = ifh[2] == 43 self.group = group self.tagtype = {} """ Dictionary of tag types """ self.reset() - (self.next,) = self._unpack("L", ifh[4:]) + (self.next,) = ( + self._unpack("Q", ifh[8:]) if self._bigtiff else self._unpack("L", ifh[4:]) + ) self._legacy_api = False prefix = property(lambda self: self._prefix) @@ -699,6 +704,7 @@ def _register_basic(idx_fmt_name): (TiffTags.FLOAT, "f", "float"), (TiffTags.DOUBLE, "d", "double"), (TiffTags.IFD, "L", "long"), + (TiffTags.LONG8, "Q", "long8"), ], ) ) @@ -776,8 +782,17 @@ def load(self, fp): self._offset = fp.tell() try: - for i in range(self._unpack("H", self._ensure_read(fp, 2))[0]): - tag, typ, count, data = self._unpack("HHL4s", self._ensure_read(fp, 12)) + tag_count = ( + self._unpack("Q", self._ensure_read(fp, 8)) + if self._bigtiff + else self._unpack("H", self._ensure_read(fp, 2)) + )[0] + for i in range(tag_count): + tag, typ, count, data = ( + self._unpack("HHQ8s", self._ensure_read(fp, 20)) + if self._bigtiff + else self._unpack("HHL4s", self._ensure_read(fp, 12)) + ) tagname = TiffTags.lookup(tag, self.group).name typname = TYPES.get(typ, "unknown") @@ -789,9 +804,9 @@ def load(self, fp): logger.debug(msg + f" - unsupported type {typ}") continue # ignore unsupported type size = count * unit_size - if size > 4: + if size > (8 if self._bigtiff else 4): here = fp.tell() - (offset,) = self._unpack("L", data) + (offset,) = self._unpack("Q" if self._bigtiff else "L", data) msg += f" Tag Location: {here} - Data Location: {offset}" fp.seek(offset) data = ImageFile._safe_read(fp, size) @@ -820,7 +835,11 @@ def load(self, fp): ) logger.debug(msg) - (self.next,) = self._unpack("L", self._ensure_read(fp, 4)) + (self.next,) = ( + self._unpack("Q", self._ensure_read(fp, 8)) + if self._bigtiff + else self._unpack("L", self._ensure_read(fp, 4)) + ) except OSError as msg: warnings.warn(str(msg)) return @@ -1042,6 +1061,8 @@ def _open(self): # Header ifh = self.fp.read(8) + if ifh[2] == 43: + ifh += self.fp.read(8) self.tag_v2 = ImageFileDirectory_v2(ifh) diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index 88856aa92d5..b37c8cf5ff4 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -74,6 +74,7 @@ def lookup(tag, group=None): FLOAT = 11 DOUBLE = 12 IFD = 13 +LONG8 = 16 TAGS_V2 = { 254: ("NewSubfileType", LONG, 1), From e9ded8545980843f49062b2f6cd518993426abd3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 11 Mar 2022 08:49:47 +1100 Subject: [PATCH 2/2] Added release notes --- docs/releasenotes/9.1.0.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/releasenotes/9.1.0.rst b/docs/releasenotes/9.1.0.rst index 22b185e95ac..1e5203ac213 100644 --- a/docs/releasenotes/9.1.0.rst +++ b/docs/releasenotes/9.1.0.rst @@ -177,6 +177,11 @@ Image._repr_pretty_ identity of the object. This allows Jupyter to describe an image and have that description stay the same on subsequent executions of the same code. +Added BigTIFF reading +^^^^^^^^^^^^^^^^^^^^^ + +Support has been added for reading BigTIFF images. + Added BLP saving ^^^^^^^^^^^^^^^^