mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 07:57:27 +03:00 
			
		
		
		
	Merge pull request #8317 from Yay295/tiff_exif_multistrip
Fixed writing multiple StripOffsets to TIFF
This commit is contained in:
		
						commit
						3f24276bf2
					
				|  | @ -108,7 +108,8 @@ class TestFileTiff: | ||||||
|             assert_image_equal_tofile(im, "Tests/images/hopper.tif") |             assert_image_equal_tofile(im, "Tests/images/hopper.tif") | ||||||
| 
 | 
 | ||||||
|         with Image.open("Tests/images/hopper_bigtiff.tif") as im: |         with Image.open("Tests/images/hopper_bigtiff.tif") as im: | ||||||
|             # multistrip support not yet implemented |             # The data type of this file's StripOffsets tag is LONG8, | ||||||
|  |             # which is not yet supported for offset data when saving multiple frames. | ||||||
|             del im.tag_v2[273] |             del im.tag_v2[273] | ||||||
| 
 | 
 | ||||||
|             outfile = str(tmp_path / "temp.tif") |             outfile = str(tmp_path / "temp.tif") | ||||||
|  |  | ||||||
|  | @ -181,6 +181,29 @@ def test_change_stripbytecounts_tag_type(tmp_path: Path) -> None: | ||||||
|         assert reloaded.tag_v2.tagtype[TiffImagePlugin.STRIPBYTECOUNTS] == TiffTags.LONG |         assert reloaded.tag_v2.tagtype[TiffImagePlugin.STRIPBYTECOUNTS] == TiffTags.LONG | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def test_save_multiple_stripoffsets() -> None: | ||||||
|  |     ifd = TiffImagePlugin.ImageFileDirectory_v2() | ||||||
|  |     ifd[TiffImagePlugin.STRIPOFFSETS] = (123, 456) | ||||||
|  |     assert ifd.tagtype[TiffImagePlugin.STRIPOFFSETS] == TiffTags.LONG | ||||||
|  | 
 | ||||||
|  |     # all values are in little-endian | ||||||
|  |     assert ifd.tobytes() == ( | ||||||
|  |         # number of tags == 1 | ||||||
|  |         b"\x01\x00" | ||||||
|  |         # tag id (2 bytes), type (2 bytes), count (4 bytes), value (4 bytes) | ||||||
|  |         # TiffImagePlugin.STRIPOFFSETS, TiffTags.LONG, 2, 18 | ||||||
|  |         # where STRIPOFFSETS is 273, LONG is 4 | ||||||
|  |         # and 18 is the offset of the tag data | ||||||
|  |         b"\x11\x01\x04\x00\x02\x00\x00\x00\x12\x00\x00\x00" | ||||||
|  |         # end of entries | ||||||
|  |         b"\x00\x00\x00\x00" | ||||||
|  |         # 26 is the total number of bytes output, | ||||||
|  |         # the offset for any auxiliary strip data that will then be appended | ||||||
|  |         # (123 + 26, 456 + 26) == (149, 482) | ||||||
|  |         b"\x95\x00\x00\x00\xe2\x01\x00\x00" | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def test_no_duplicate_50741_tag() -> None: | def test_no_duplicate_50741_tag() -> None: | ||||||
|     assert TAG_IDS["MakerNoteSafety"] == 50741 |     assert TAG_IDS["MakerNoteSafety"] == 50741 | ||||||
|     assert TAG_IDS["BestQualityScale"] == 50780 |     assert TAG_IDS["BestQualityScale"] == 50780 | ||||||
|  |  | ||||||
|  | @ -991,9 +991,11 @@ class ImageFileDirectory_v2(_IFDv2Base): | ||||||
|         if stripoffsets is not None: |         if stripoffsets is not None: | ||||||
|             tag, typ, count, value, data = entries[stripoffsets] |             tag, typ, count, value, data = entries[stripoffsets] | ||||||
|             if data: |             if data: | ||||||
|                 msg = "multistrip support not yet implemented" |                 size, handler = self._load_dispatch[typ] | ||||||
|                 raise NotImplementedError(msg) |                 values = [val + offset for val in handler(self, data, self.legacy_api)] | ||||||
|             value = self._pack("L", self._unpack("L", value)[0] + offset) |                 data = self._write_dispatch[typ](self, *values) | ||||||
|  |             else: | ||||||
|  |                 value = self._pack("L", self._unpack("L", value)[0] + offset) | ||||||
|             entries[stripoffsets] = tag, typ, count, value, data |             entries[stripoffsets] = tag, typ, count, value, data | ||||||
| 
 | 
 | ||||||
|         # pass 2: write entries to file |         # pass 2: write entries to file | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user