diff --git a/Tests/images/g4_orientation_1.tif b/Tests/images/g4_orientation_1.tif new file mode 100755 index 000000000..8ab0f1d0d Binary files /dev/null and b/Tests/images/g4_orientation_1.tif differ diff --git a/Tests/images/g4_orientation_2.tif b/Tests/images/g4_orientation_2.tif new file mode 100755 index 000000000..4ab085641 Binary files /dev/null and b/Tests/images/g4_orientation_2.tif differ diff --git a/Tests/images/g4_orientation_3.tif b/Tests/images/g4_orientation_3.tif new file mode 100755 index 000000000..ca0d0fe29 Binary files /dev/null and b/Tests/images/g4_orientation_3.tif differ diff --git a/Tests/images/g4_orientation_4.tif b/Tests/images/g4_orientation_4.tif new file mode 100755 index 000000000..166381fb7 Binary files /dev/null and b/Tests/images/g4_orientation_4.tif differ diff --git a/Tests/images/g4_orientation_5.tif b/Tests/images/g4_orientation_5.tif new file mode 100755 index 000000000..9fecaad65 Binary files /dev/null and b/Tests/images/g4_orientation_5.tif differ diff --git a/Tests/images/g4_orientation_6.tif b/Tests/images/g4_orientation_6.tif new file mode 100755 index 000000000..6abc001eb Binary files /dev/null and b/Tests/images/g4_orientation_6.tif differ diff --git a/Tests/images/g4_orientation_7.tif b/Tests/images/g4_orientation_7.tif new file mode 100755 index 000000000..0babc9108 Binary files /dev/null and b/Tests/images/g4_orientation_7.tif differ diff --git a/Tests/images/g4_orientation_8.tif b/Tests/images/g4_orientation_8.tif new file mode 100755 index 000000000..3216a3725 Binary files /dev/null and b/Tests/images/g4_orientation_8.tif differ diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 6339d878a..41d5dae7e 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -831,3 +831,12 @@ class TestFileLibTiff(LibTiffTestCase): self.assert_image_equal_tofile( im, "Tests/images/old-style-jpeg-compression.png" ) + + def test_orientation(self): + base_im = Image.open("Tests/images/g4_orientation_1.tif") + + for i in range(2, 9): + im = Image.open("Tests/images/g4_orientation_" + str(i) + ".tif") + im.load() + + self.assert_image_similar(base_im, im, 0.7) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index bb86c53aa..b2d78cfd5 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1098,6 +1098,20 @@ class TiffImageFile(ImageFile.ImageFile): return super(TiffImageFile, self).load() def load_end(self): + if self._tile_orientation: + method = { + 2: Image.FLIP_LEFT_RIGHT, + 3: Image.ROTATE_180, + 4: Image.FLIP_TOP_BOTTOM, + 5: Image.TRANSPOSE, + 6: Image.ROTATE_270, + 7: Image.TRANSVERSE, + 8: Image.ROTATE_90, + }.get(self._tile_orientation) + if method is not None: + self.im = self.im.transpose(method) + self._size = self.im.size + # allow closing if we're on the first frame, there's no next # This is the ImageFile.load path only, libtiff specific below. if not self._is_animated: @@ -1181,6 +1195,9 @@ class TiffImageFile(ImageFile.ImageFile): self.tile = [] self.readonly = 0 + + self.load_end() + # libtiff closed the fp in a, we need to close self.fp, if possible if self._exclusive_fp and not self._is_animated: self.fp.close() @@ -1388,6 +1405,8 @@ class TiffImageFile(ImageFile.ImageFile): 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) + def _close__fp(self): try: if self.__fp != self.fp: