Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Procesado de fotografías de forma automatizada

Última Actualización: 28 de julio de 2010 - Miércoles

Cuando subo fotos a mi web las proceso un poco. Nada de retoque, sino cosas como enderezar las fotografías giradas (mi cámara no tiene sensor de gravedad, así que hay que hacerlo a mano), recomprimirlas para que tengan un tamaño razonable, etc.

Hace tiempo lo hacía a mano, con el "GIMP", pero era una tarea muy lenta y proclive a errores. En una actualización del GIMP la tarea se volvió más tediosa aún, así que me puse a buscar alternativas. Idealmente automatizadas.

Tras investigar durante un tiempo, he llegado al siguiente proceso, bastante limpio y rápido. Como ventaja adicional, estas operaciones conservan la información EXIF de la cámara, algo que no ocurría con mi procesamiento manual original.

Los pasos son los siguientes:

  1. Hacemos copia de las fotos a procesar. Trabajaremos sobre las copias. No cuesta nada hacerlo, con la capacidad de los discos duros actuales, y perder las fotos de las vacaciones por un error tonto es imperdonable.

  2. Si las fotografías están sacadas con una cámara con sensor de gravedad, podemos procesarlas para ponerlas "derechas" de forma automatizada.

    Para saber si es el caso, basta con mirar las fotografías con un visor (que interprete la información de posición presente en el EXIF de las fotos). Si las fotos tomadas "inclinadas" aparecen derechas, entonces la cámara dispone de sensor de gravedad, y nuestro visor la interpreta. En este caso hacemos:

    1. El siguiente comando toma las fotos y las gira apropiadamente. El giro se realiza internamente con la herramienta "jpegtran", que realiza un giro perfecto sin pérdidas (manipulando los coeficientes DCT directamente) si la imagen tiene las dimensiones apropiadas (documentadas en "man jpegtran"). El comando "jpegtran" es versátil, y permite cosas adicionales, como convertir la imagen de "baseline" a "progressive", o pasar la imagen a blanco y negro, trasponerla, etc. Todo sin pérdida de calidad.
      jhead -autorot *.jpg

      Este comando rota las imágenes que lo necesitan, y copia y actualiza su información EXIF para indicar que ya están "derechas".

    Si la cámara no guarda información de los sensores de gravedad, hay que girarlas de forma manual:

    1. Movemos las fotos que hay que girar de cierta manera a una carpeta separada. Por ejemplo, todas las fotos que hay que girar 90 grados en sentido antihorario.

    2. Entramos en ese directorio y giramos las fotografías de forma apropiada. Por ejemplo:
      jhead -cmd "jpegtran -rotate 90 &i > &o" *.jpg

      Este comando gira las imágenes 90 grados en sentido antihorario, copiando la información EXIF a la nueva versión.

    3. Movemos las fotos giradas al directorio principal, con las fotos "derechas".

    4. Si hay fotos pendientes de girar, volvemos al paso 1.

  3. Una vez que tenemos todas las fotos "derechas", quiero recomprimirlas a un nivel de calidad "aceptable": tamaño razonable sin pérdida de calidad apreciable. Tradicionalmente el nivel de calidad que he utilizado es de 85.
    jhead -dt -cmd "djpeg &i | cjpeg -quality 85 -optimize -progressive > &o" *.jpg

    Este comando descomprime las fotos y las vuelve a comprimir de nuevo al nivel de calidad seleccionado. Naturalmente, esta operación implica una pérdida de calidad (con suerte, inapreciable). Los parámetros "optimize" y "progressive" generan ficheros más pequeños.

    El comando en sí copia también la información EXIF. El parámetro "-dt" elimina el posible "thumbnail" de la imagen, que no nos sirve para nada en la versión web, que puede no corresponder ya con la realidad (si hemos girado la foto) y que, en resumen, ocupa espacio inútil.

Los pasos anteriores generan fotos "derechas", comprimidas con el nivel de calidad deseado y manteniendo la información EXIF original (salvo el "thumbnail").

El último comando introduce pérdidas, pero en mis pruebas puedo ejecutarlo de forma repetida sin pérdida apreciable de calidad. Eso es bueno. Lo que no lo es tanto es que si recomprimimos con calidad 85 una fotografía cuyo nivel de calidad ya estaba fijado más bajo, la imagen resultante medirá más que la original, sin haber ganado nada de calidad. Por ello lo ideal es, por un lado, comparar el tamaño de las imágenes procesadas con las originales (que guardamos en el primer punto, ¿recuerdas?) y, por otro lado, sacar las fotografías al máximo nivel de calidad posible, salvo que tengamos la memoria de la cámara achuchada.

Todos los comandos indicados ("jhead", "jpegtran", "cjpeg", "djpeg") tienen opciones interesantes, que es buena idea conocer. Vale la pena echarle un ojo a los manuales.


Historia

  • 28/jul/10: Primera versión de este documento



Python Zope ©2010 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS