Skip to content

Commit

Permalink
Merge pull request #5584 from radarhere/exif_transpose
Browse files Browse the repository at this point in the history
Handle removing orientation from alternate types of EXIF data
  • Loading branch information
hugovk committed Jul 6, 2021
2 parents b057f5f + 917a598 commit 340adc5
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 2 deletions.
Binary file added Tests/images/exif_imagemagick_orientation.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
22 changes: 22 additions & 0 deletions Tests/test_imageops.py
Expand Up @@ -335,6 +335,28 @@ def check(orientation_im):
) as orientation_im:
check(orientation_im)

# Orientation from "XML:com.adobe.xmp" info key
with Image.open("Tests/images/xmp_tags_orientation.png") as im:
assert im.getexif()[0x0112] == 3

transposed_im = ImageOps.exif_transpose(im)
assert 0x0112 not in transposed_im.getexif()

# Orientation from "Raw profile type exif" info key
# This test image has been manually hexedited from exif_imagemagick.png
# to have a different orientation
with Image.open("Tests/images/exif_imagemagick_orientation.png") as im:
assert im.getexif()[0x0112] == 3

transposed_im = ImageOps.exif_transpose(im)
assert 0x0112 not in transposed_im.getexif()

# Orientation set directly on Image.Exif
im = hopper()
im.getexif()[0x0112] = 3
transposed_im = ImageOps.exif_transpose(im)
assert 0x0112 not in transposed_im.getexif()


def test_autocontrast_cutoff():
# Test the cutoff argument of autocontrast
Expand Down
17 changes: 15 additions & 2 deletions src/PIL/ImageOps.py
Expand Up @@ -19,6 +19,7 @@

import functools
import operator
import re

from . import Image, ImageDraw

Expand Down Expand Up @@ -588,7 +589,19 @@ def exif_transpose(image):
if method is not None:
transposed_image = image.transpose(method)
transposed_exif = transposed_image.getexif()
del transposed_exif[0x0112]
transposed_image.info["exif"] = transposed_exif.tobytes()
if 0x0112 in transposed_exif:
del transposed_exif[0x0112]
if "exif" in transposed_image.info:
transposed_image.info["exif"] = transposed_exif.tobytes()
elif "Raw profile type exif" in transposed_image.info:
transposed_image.info[
"Raw profile type exif"
] = transposed_exif.tobytes().hex()
elif "XML:com.adobe.xmp" in transposed_image.info:
transposed_image.info["XML:com.adobe.xmp"] = re.sub(
r'tiff:Orientation="([0-9])"',
"",
transposed_image.info["XML:com.adobe.xmp"],
)
return transposed_image
return image.copy()

0 comments on commit 340adc5

Please sign in to comment.