Merge pull request #5144 from UrielMaD/feature_xmp

This commit is contained in:
Hugo van Kemenade 2021-04-01 12:44:47 +03:00 committed by GitHub
commit 6812205f18
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 0 deletions

BIN
Tests/images/xmp_test.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@ -0,0 +1,9 @@
from PIL import Image
def test_getxmp():
with Image.open("Tests/images/xmp_test.jpg") as im:
xmp = im.getxmp()
assert isinstance(xmp, dict)
assert xmp["Description"]["Version"] == "10.4"

View File

@ -528,6 +528,7 @@ class Image:
self.readonly = 0
self.pyaccess = None
self._exif = None
self._xmp = None
def __getattr__(self, name):
if name == "category":
@ -1339,6 +1340,27 @@ class Image:
return self._exif
def getxmp(self):
"""
Returns a dictionary containing the xmp tags for a given image.
:returns: XMP tags in a dictionary.
"""
if self._xmp is None:
self._xmp = {}
for segment, content in self.applist:
if segment == "APP1":
marker, xmp_tags = content.rsplit(b"\x00", 1)
if marker == b"http://ns.adobe.com/xap/1.0/":
root = xml.etree.ElementTree.fromstring(xmp_tags)
for element in root.findall(".//"):
self._xmp[element.tag.split("}")[1]] = {
child.split("}")[1]: value
for child, value in element.attrib.items()
}
return self._xmp
def getim(self):
"""
Returns a capsule that points to the internal image memory.