Skip to main content

Use native Core Graphics / ImageIO API on macOS to access and change image metadata

Project description

CGMetadata

Read and write image metadata on macOS from Python using the native ImageIO / Core Graphics frameworks.

CGMetadata is a Python wrapper around the macOS ImageIO and Core Graphics frameworks. It provides a simple interface for reading and writing image metadata, including EXIF, IPTC, and XMP data. Reading is supported for all image formats supported by ImageIO. Reading is also supported for video formats using AVFoundation.

Writing is not currently supported for RAW file formats nor for video formats. Writing of metadata has been tested on JPEG, PNG, TIFF, and HEIC files however it should be considered experimental. If you are using CGMetadata to write metadata to image files, please make sure you have tested the results before using it in production.

Synopsis

>>> from cgmetadata import ImageMetadata, VideoMetadata, IPTC, XMP
>>> md = ImageMetadata("test.jpeg")
>>> md.exif["LensMake"]
'Apple'
>>> md.iptc["Keywords"]
['fruit', 'tree']
>>> md.xmp["dc:description"]
['A pair of pears on a tree']
>>> # get XMP sidecar as a str
>>> xmp = md.xmp_dumps()
>>> # write an XMP sidecar file for the image
>>> with open("test.xmp", "w") as f:
...     md.xmp_dump(f)
...
>>> # read metadata from  XMP sidecar file and apply to image
>>> with open("test.xmp", "r") as f:
...     md.xmp_load(f)
...
>>> 
>>> md.write()
>>> # set metadata
>>> md.set(XMP, "dc:description", ["Test image"])
>>> md.set(IPTC, "Keywords", ["foo", "bar"])
>>> md.write()
>>> md.xmp["dc:description"]
['Test image']
>>> md.iptc["Keywords"]
['foo', 'bar']
>>> 
>>> # update values with context manager
>>> with ImageMetadata("test.jpeg") as md:
...     md.set(IPTC, "Keywords", ["Fizz", "Buzz"])
...     md.set(XMP, "dc:creator", ["CGMetadata"])
...
>>> md.iptc["Keywords"]
['Fizz', 'Buzz']
>>> 
>>> # read metadata from video file
>>> md = VideoMetadata("test.MOV")
>>> md.xmp.get("dc:subject")
['Coffee', 'Espresso']
>>> 

CGMetadata also include a utility function for reading an XMP file and returning a dictionary of metadata using native macOS APIs. This may be useful by itself as it doesn't require the use of external libraries or XML parsers.

>>> from cgmetadata import metadata_dictionary_from_xmp_packet
>>> xmp_data = open("test.xmp").read()
>>> metadata_dictionary_from_xmp_packet(xmp_data)
{'dc:subject': ['Coffee', 'Espresso'], 'iio:hasXMP': 'True'}
>>>

Installation

pip install cgmetadata

Documentation

The documentation for CGMetadata is available at https://RhetTbull.github.io/CGMetadata/.

Source Code

The source code for this project is available on GitHub.

Command Line Interface

The package will install a small command line interface (CLI), cgmd, which prints metadata for an image file in tabular, JSON, CSV, TSV, or XMP formats. The CLI can also be run by executing python3 -m cgmetadata.

usage: cgmd [-h] [--version] [--csv] [--tsv] [--json] [--xmp] [--indent INDENT] [--no-header] IMAGE_OR_VIDEO

Print metadata for image files in various formats.

positional arguments:
  IMAGE_OR_VIDEO        path to image or video file

options:
  -h, --help            show this help message and exit
  --version, -v         show program's version number and exit
  --csv, -c             output as comma separated values (CSV); see also --no-header
  --tsv, -t             output as tab separated values (TSV); see also --no-header
  --json, -j            output as JSON; see also --indent
  --xmp, -x             output XMP sidecar for image; see also --no-header
  --indent INDENT, -i INDENT
                        indent level for JSON; default 4, use 0 for no indentation
  --no-header, -H       when used with --csv, --tsv, omit column headers; when used with --xmp, omit XMP packet header

Supported Versions

CGMetadata has been tested on macOS 13 (Ventura) but should work on macOS 11 (Big Sur) and later. It will not work on earlier versions of macOS due to the use of certain APIs that were introduced in macOS 11. It is compatible with Python 3.9 and later.

License

MIT License, copyright Rhet Turnbull, 2023.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cgmetadata-0.2.0.tar.gz (20.6 kB view details)

Uploaded Source

Built Distribution

cgmetadata-0.2.0-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

File details

Details for the file cgmetadata-0.2.0.tar.gz.

File metadata

  • Download URL: cgmetadata-0.2.0.tar.gz
  • Upload date:
  • Size: 20.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.31.0

File hashes

Hashes for cgmetadata-0.2.0.tar.gz
Algorithm Hash digest
SHA256 f6805dcb107bed1c736b3f0869c043637ffd8f8956b9bc7b4de6aa6e2876f5cf
MD5 b759879f1a34e0d212c9f7d0547e51ec
BLAKE2b-256 2730c0d164d67d8611eafb93329921884f46763a725533f05fa47e682c5c5aa5

See more details on using hashes here.

File details

Details for the file cgmetadata-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: cgmetadata-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 19.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.31.0

File hashes

Hashes for cgmetadata-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 531ee6c4d120c134c57589181bc5fb053bcdf9d7b949f33d3e5ab5db5d7d7f07
MD5 49b28b18a5c6e923d4442851496e56a2
BLAKE2b-256 e105c735618c13d67d31a50d896d1f607d6c03fd70278c28c8eaa4c81fa6fdee

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page