Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use TIFF orientation #4063

Merged
merged 1 commit into from Sep 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Binary file added Tests/images/g4_orientation_1.tif
Binary file not shown.
Binary file added Tests/images/g4_orientation_2.tif
Binary file not shown.
Binary file added Tests/images/g4_orientation_3.tif
Binary file not shown.
Binary file added Tests/images/g4_orientation_4.tif
Binary file not shown.
Binary file added Tests/images/g4_orientation_5.tif
Binary file not shown.
Binary file added Tests/images/g4_orientation_6.tif
Binary file not shown.
Binary file added Tests/images/g4_orientation_7.tif
Binary file not shown.
Binary file added Tests/images/g4_orientation_8.tif
Binary file not shown.
9 changes: 9 additions & 0 deletions Tests/test_file_libtiff.py
Expand Up @@ -831,3 +831,12 @@ def test_old_style_jpeg(self):
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)
19 changes: 19 additions & 0 deletions src/PIL/TiffImagePlugin.py
Expand Up @@ -1098,6 +1098,20 @@ def load(self):
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:
Expand Down Expand Up @@ -1181,6 +1195,9 @@ def _load_libtiff(self):

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()
Expand Down Expand Up @@ -1388,6 +1405,8 @@ 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)

def _close__fp(self):
try:
if self.__fp != self.fp:
Expand Down