Skip to content

Commit 6812205

Browse files
authored
Merge pull request #5144 from UrielMaD/feature_xmp
2 parents b90c73f + 7f5dbb7 commit 6812205

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

Tests/images/xmp_test.jpg

1.72 MB
Loading

Tests/test_image_getxmp.py

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from PIL import Image
2+
3+
4+
def test_getxmp():
5+
with Image.open("Tests/images/xmp_test.jpg") as im:
6+
xmp = im.getxmp()
7+
8+
assert isinstance(xmp, dict)
9+
assert xmp["Description"]["Version"] == "10.4"

src/PIL/Image.py

+22
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,7 @@ def __init__(self):
528528
self.readonly = 0
529529
self.pyaccess = None
530530
self._exif = None
531+
self._xmp = None
531532

532533
def __getattr__(self, name):
533534
if name == "category":
@@ -1339,6 +1340,27 @@ def getexif(self):
13391340

13401341
return self._exif
13411342

1343+
def getxmp(self):
1344+
"""
1345+
Returns a dictionary containing the xmp tags for a given image.
1346+
:returns: XMP tags in a dictionary.
1347+
"""
1348+
1349+
if self._xmp is None:
1350+
self._xmp = {}
1351+
1352+
for segment, content in self.applist:
1353+
if segment == "APP1":
1354+
marker, xmp_tags = content.rsplit(b"\x00", 1)
1355+
if marker == b"http://ns.adobe.com/xap/1.0/":
1356+
root = xml.etree.ElementTree.fromstring(xmp_tags)
1357+
for element in root.findall(".//"):
1358+
self._xmp[element.tag.split("}")[1]] = {
1359+
child.split("}")[1]: value
1360+
for child, value in element.attrib.items()
1361+
}
1362+
return self._xmp
1363+
13421364
def getim(self):
13431365
"""
13441366
Returns a capsule that points to the internal image memory.

0 commit comments

Comments
 (0)