· Cambiar idioma (Actualmente: Español)

Manipulación de metadatos de imágenes con Python 2.x

Mayo 21, 2014 00:00 -0500

En imagenes digitales se pueden incrustar datos como autor, fecha de creación, descripción, permisos, entre otros, de tal forma que estos datos viajen siempre con la imagen. Aprenda a leer y a escribir estos metadatos usando Python.

Figura 1
Figura 1. Diatomeas marinas fotografiadas por el Prof. Gordon T. Taylor de la Universidad Stony Brook.

Note

Este artículo es obsolescente. Las instrucciones que se dan aquí, aunque todavía pueden funcionar, ya están desactualizadas. Lea el artículo más reciente para aprender a hacer lo mismo con herramientas actuales.

En imagenes digitales se pueden incrustar datos como autor, fecha de creación, descripción, permisos, entre otros, de tal forma que estos datos viajen siempre con la imagen [1].

La imagen de la Figura 1, por ejemplo, fue manipulada con un script escrito en Python y que usa pyexiv2 para agregar metadatos. Si se descarga la imagen y se inspeccionan sus propiedades, pueden leerse los siguientes metadatos:

Figura 2
Figura 2. Metadatos de una imagen vistos en el diálogo de propiedades del navegador de archivos Nautilus, en Debian 7.

Formatos de metadatos

Parece que hay tres formatos populares para incrustar metadatos en imágenes:

De los tres anteriores, XMP parece mejor por ser un estándar ISO y porque es compatible con más formatos de imágenes (y otros tipos de archivos). Los siguientes ejemplos usan XMP como formato de metadatos.

Ejemplo 1: Leer metadatos

from pyexiv2 import ImageMetadata


# Load image metadata
image = "diatoms.jpg"
metadata = ImageMetadata(image)
metadata.read()

# Print XMP metadata
if metadata.xmp_keys:
    for key in metadata.xmp_keys:
        print("{}: {}".format(key, metadata[key].raw_value))

Al ejecutar el código anterior, en este caso guardado como archivo read.py al mismo nivel de la imagen que aparece al inicio de esta entrada, se pueden leer los metadatos en el terminal:

$ python read.py
Xmp.dc.source: http://www.photolib.noaa.gov/htmls/corp2365.htm
Xmp.dc.title: {'x-default': 'Diatoms through the microscope'}
Xmp.dc.date: ['1983-01-20']
Xmp.dc.description: {'x-default': '\nAssorted diatoms as seen through a microscope. These specimens were living\nbetween crystals of annual sea ice in McMurdo Sound, Antarctica. Image\ndigitized from original 35mm Ektachrome slide. These tiny phytoplankton are\nencased within a silicate cell wall.\n'}
Xmp.dc.subject: ['Antartica', 'Oceanography', 'Biological', 'Diatoms']
Xmp.dc.creator: ['Prof. Gordon T. Taylor, Stony Brook University']
Xmp.dc.contributor: ['NSF Polar Programs']
Xmp.dc.rights: {'x-default': 'Public domain'}

Ejemplo 2: Escribir metadatos

Los metadatos de la imagen de la Figura 1 se agregaron usando el siguiente código sobre la imagen original, que no contenía metadatos XMP.

from datetime import datetime

from pyexiv2 import ImageMetadata, XmpTag


# Load image metadata
image = ImageMetadata("diatoms.jpg")
image.read()


# Add XMP metadata and write it to the images
image["Xmp.dc.title"] = "Diatoms through the microscope"
image["Xmp.dc.date"] = [datetime(1983, 1, 20)]
image["Xmp.dc.description"] = """
Assorted diatoms as seen through a microscope. These specimens were living
between crystals of annual sea ice in McMurdo Sound, Antarctica. Image
digitized from original 35mm Ektachrome slide. These tiny phytoplankton are
encased within a silicate cell wall.
"""
image["Xmp.dc.subject"] = [
    "Antartica", "Oceanography", "Biological", "Diatoms"
]
image["Xmp.dc.creator"] = ["Prof. Gordon T. Taylor, Stony Brook University"]
image["Xmp.dc.contributor"] = ["NSF Polar Programs"]
image["Xmp.dc.rights"] = "Public domain"
image["Xmp.dc.source"] = "http://www.photolib.noaa.gov/htmls/corp2365.htm"

image.write()
[1]Realmente los metadatos viajan con la imagen hasta que otro software decide modificarlos o eliminarlos. Por ejemplo, si subo una imagen con metadatos como los que se presentan en esta entrada a un blog de WordPress.com, WordPress los elimina. ¿Por qué lo hacen? No sé.

Temas relacionados: