Cómo rotar imágenes automáticamente, en base a datos exif

31

Cuando hago fotos con mi cámara (Olympus E-520), en los datos EXIF ​​se almacena la orientación.

El visor de imágenes estándar en Ubuntu muestra estas imágenes correctamente. Visor de Windows sin embargo no.

¿Hay alguna manera de rotar realmente estas imágenes (si es necesario según EXIF) en un lote en Ubuntu? Por ejemplo, con una herramienta ImageMagick?

Peter Smit
fuente

Respuestas:

37

exiftrany JHead ( jhead -autorot) puede hacer esto. exiftranpuede hacer esto sin pérdidas, no estoy seguro jhead.

usuario7963
fuente
1
¡Parece que exiftran es exactamente lo que necesito!
Peter Smit
3
jhead -autorot invoca jpegtran, que puede hacer una rotación perfectamente sin pérdidas. Me había olvidado por completo de las cosas sin pérdidas de IJG. jpegclub.org/losslessapps.html Exiftran también puede hacer rotación sin pérdidas, y es mejor que jpegtran porque respeta la información exif en el archivo de imagen. Sin embargo, debe tener en cuenta que a veces (y no estoy seguro de todos los detalles) no puede rotar sin pérdidas. Entonces, si implementa una secuencia de comandos con jhead para identificar la rotación necesaria (similar a mi anterior, pero con una declaración de caso para manejar todas las rotaciones), debería soportar volver a la rotación con pérdida.
opello
1
Hice algunas pruebas con exiftran -a (rotación automática basada en la etiqueta de orientación exif), y parece funcionar muy bien. Con respecto a la rotación sin pérdidas, no pude recuperar la imagen de origen realizando la inversa de la rotación realizada. Ej. Exiftool -F 1.jpg -o 2.jpg; exiftool -F 2.jpg -o 3.jpg; md5sum de 1.jpg y 3.jpg no son lo mismo. Tras una inspección más cercana (con la comparación binaria de fusión de Araxis), a veces era solo la información de encabezado exif que difería, otras veces eran cambios importantes en el archivo. Sin embargo, la comparación de imágenes de fusión de Araxis no mostró píxeles sin cambios.
opello
No quise cambiar * píxeles (eran imágenes idénticas a píxeles). Además, no estoy seguro sobre el protocolo stackoverflow / superusuario, pero creo que dmityugov debería obtener este para recomendar la herramienta adecuada.
opello
1
Descubrí que exiftran puede eliminar algunos metadatos del archivo. Por ejemplo, las imágenes tomadas por Samsung Galaxy S2 tienen un campo de marca de tiempo (posiblemente no EXIF), y exiftran lo eliminará. exiftran -a también alterará la imagen que no necesita rotación. jhead -autorot está libre de ambos problemas. OTOH, carece de la opción de preservar el archivo mtime (pero hay un interruptor -ft como solución alternativa).
pfalcon
12

La herramienta de conversión de ImageMagick tiene un indicador de orientación automática que debe hacer el trabajo.

#!/bin/bash

JHEAD=jhead
SED=sed
CONVERT=convert

for f in *.jpg
do
        orientation=$($JHEAD -v $f | $SED -nr 's:.*Orientation = ([0-9]+).*:\1:p')

        if [ -z $orientation ]
        then
                orientation=0
        fi

        if [ $orientation -gt 1 ]
        then
                echo Rotating $f...
                mv $f $f.bak
                $CONVERT -auto-orient $f.bak $f
        fi
done

Creé un script rápido para iterar sobre * .jpg en el directorio actual. Puede modificar esto fácilmente para tomar una ruta ($ 1) o lo que necesite.

revs opello
fuente
1
¡Excelente! Ese que no encontré. Lo uso con mogrify para hacer un lote de imágenes. Solo una pregunta, ¿por qué reescribe todas las imágenes, incluso si no se supone que cambien? (Los hashes difieren)
Peter Smit, el
No estoy seguro de por qué, pero parece hacer una nueva codificación completa mirando tanto la diferencia de imagen como la diferencia binaria.
opello
Wow esto es genial. Muchas gracias. Si no se agregan otras respuestas excelentes, seguramente aceptaré esta.
Peter Smit
2

Puede usar XnView para hacer eso. Consulte estas páginas para obtener información sobre el uso de XnView para realizar la rotación automática en modo por lotes:

En Windows, puede hacerlo usando IrfanView . De la sección de preguntas frecuentes del sitio web de IrfanView:

P: ¿Cómo utilizar las operaciones sin pérdida de JPG (rotación, IPTC, comentario) en modo por lotes?

R: Inicie la ventana Miniatura, abra la carpeta con JPG, seleccione muchos JPG y vea en el menú de miniaturas Archivo para JPG Operaciones sin pérdida -> Transformaciones sin pérdida con los pulgares seleccionados. Nota: La opción de rotación automática funciona solo si la etiqueta de orientación EXIF ​​se guarda correctamente (no arriba a la izquierda).

swatkat
fuente
1

Con ImageMagick también puede usar mogrify para rotar los archivos y volver a escribir la imagen girada en los nombres de archivo originales.

mogrify -auto-orient *.jpg
Andy Gee
fuente