Skip to content

Commit 1e63f77

Browse files
committed
Parse orientation from XMP tags
1 parent 97280a0 commit 1e63f77

4 files changed

Lines changed: 27 additions & 0 deletions

File tree

171 KB
Loading

Tests/test_file_png.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,11 @@ def test_exif(self, test_file):
603603
exif = im._getexif()
604604
assert exif[274] == 1
605605

606+
def test_xmp_tags_orientation(self):
607+
with Image.open("Tests/images/xmp_tags_orientation.png") as im:
608+
exif = im.getexif()
609+
assert exif[274] == 3
610+
606611
def test_exif_save(self, tmp_path):
607612
with Image.open("Tests/images/exif.png") as im:
608613
test_file = str(tmp_path / "temp.png")

src/PIL/Image.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import sys
3636
import tempfile
3737
import warnings
38+
import xml.etree.ElementTree
3839
from collections.abc import Callable, MutableMapping
3940
from pathlib import Path
4041

@@ -1297,10 +1298,30 @@ def getextrema(self):
12971298
return tuple(extrema)
12981299
return self.im.getextrema()
12991300

1301+
def _parse_xmp_tags(self):
1302+
if 0x0112 in self._exif:
1303+
return
1304+
1305+
xmp_tags = self.info.get("XML:com.adobe.xmp")
1306+
if not xmp_tags:
1307+
return
1308+
1309+
root = xml.etree.ElementTree.fromstring(xmp_tags)
1310+
for elem in root.iter():
1311+
if elem.tag.endswith("}Description"):
1312+
break
1313+
else:
1314+
return
1315+
1316+
orientation = elem.attrib.get("{http://ns.adobe.com/tiff/1.0/}Orientation")
1317+
if orientation:
1318+
self._exif[0x0112] = int(orientation)
1319+
13001320
def getexif(self):
13011321
if self._exif is None:
13021322
self._exif = Exif()
13031323
self._exif.load(self.info.get("exif"))
1324+
self._parse_xmp_tags()
13041325
return self._exif
13051326

13061327
def getim(self):

src/PIL/PngImagePlugin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,7 @@ def getexif(self):
940940
"".join(self.info["Raw profile type exif"].split("\n")[3:])
941941
)
942942
self._exif.load(exif_info)
943+
self._parse_xmp_tags()
943944
return self._exif
944945

945946
def _close__fp(self):

0 commit comments

Comments
 (0)