diff --git a/Tests/images/exif_transpose_rational_mismatch.jpg b/Tests/images/exif_transpose_rational_mismatch.jpg new file mode 100644 index 000000000..c98e64357 Binary files /dev/null and b/Tests/images/exif_transpose_rational_mismatch.jpg differ diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index af78c1197..40b6440dd 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -307,3 +307,10 @@ def test_exif_transpose(): "Tests/images/hopper_orientation_" + str(i) + ext ) as orientation_im: check(orientation_im) + + +def test_exif_transpose_metadata_error(): + with Image.open("Tests/images/exif_transpose_rational_mismatch.jpg") as img: + transposed = ImageOps.exif_transpose(img) + parsed_exif = transposed.getexif() + assert parsed_exif[318] == [(313, 1000), (329, 1000)] diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 74fb69516..59985e119 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -258,8 +258,9 @@ def _accept(prefix): def _limit_rational(val, max_val): - inv = abs(val) > 1 - n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) + ifd_val = IFDRational(val[0], val[1]) if isinstance(val, tuple) else val + inv = abs(ifd_val) > 1 + n_d = IFDRational(1 / ifd_val if inv else ifd_val).limit_rational(max_val) return n_d[::-1] if inv else n_d