Cómo quitar metadatos de archivos de imagen

16

[ EDITAR # 1 por OP: Resulta que esta pregunta está bastante bien respondida por el creador / mantenedor de exiftool Phil Harvey en un hilo duplicado en el foro de ExifTool ]

[ EDITAR # 2 por OP: De ExifTool Preguntas frecuentes : No se garantiza que ExifTool elimine completamente los metadatos de un archivo al intentar eliminar todos los metadatos. Ver "Limitaciones del escritor".]

Me gustaría buscar en mis viejos discos duros fotos que no estén en mi disco de respaldo actual. Los formatos incluyen jpg, png, tif, etc., así como varios formatos sin formato (diferentes modelos y fabricantes de cámaras).

Solo estoy interesado en la unicidad de la imagen en sí y no en la unicidad debido a las diferencias en, por ejemplo, los valores de las etiquetas exif, la presencia / ausencia de una etiqueta exif en sí misma, miniaturas incrustadas, etc.

Aunque no espero encontrar ninguna corrupción / podredumbre de datos entre diferentes copias de imágenes idénticas, me gustaría detectar eso, así como las diferencias debido al cambio de tamaño y los cambios de color.

[ Editar # 3 por OP: Para aclarar: un pequeño porcentaje de falsos positivos es tolerable (se concluye que un archivo es único cuando no lo es) y los falsos negativos son altamente indeseables (se concluye erróneamente que un archivo es un duplicado). ]

Mi plan es identificar la unicidad basada en md5sums después de eliminar todos y cada uno de los metadatos.

¿Cómo puedo quitar los metadatos?

Será exiftool -all= <filename>suficiente?

Jeff
fuente
1
Las bibliotecas de compresión JPEG se comprimen de diferentes maneras, por lo tanto, incluso si elimina todos los metadatos, puede terminar con la misma imagen con una suma de verificación diferente porque se comprimió con una implementación JPEG diferente. Deberá volver a guardar todas las imágenes con la misma biblioteca (lo que puede disminuir algo la calidad). Además, ¿cómo planeas encontrar todas las imágenes? fileno podrá descubrir formatos de imagen RAW y findsolo funcionará en extensiones (puede ser útil describir mejor lo que tiene)
grochmal
He estado usando find $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"where <...>significa un montón de otros sufijos.
Jeff
Buen punto sobre diferentes bibliotecas de compresión.
Jeff
1
Puede probar si las imágenes normalizadas BMP convert image.jpg - | md5sum(ImageMagick) le dan sumas MD5 apropiadas.
aventurina
1
Existe un algoritmo de hash perceptual llamado phash que es útil para comparar cuán perceptualmente similares son dos imágenes. stackoverflow tiene una etiqueta aquí stackoverflow.com/questions/tagged/phash Ahora tener una herramienta que compara dos archivos es útil, pero podría llevar a tener trabajo O (n * n). para encontrar todas las coincidencias. Probablemente haya flujos de trabajo que funcionen mejor, pero no conozco uno de antemano. Pero Phash es una miga de pan que podría llevarte a uno. Al parecer ImageMagick tiene algún tipo de apoyo phash
infijo

Respuestas:

11

jheadtiene la capacidad de eliminar metadatos que no son imágenes de los archivos JPEG. La página del manual dice:

-dc

Eliminar el campo de comentarios del encabezado JPEG. Tenga en cuenta que el comentario no es parte del encabezado Exif.

-de

Eliminar el encabezado Exif por completo. Deja otras secciones de metadatos intactas.

-di

Elimine la sección IPTC, si está presente. Deja otras secciones de metadatos intactas.

-dx

Elimine la sección XMP, si está presente. Deja otras secciones de metadatos intactas.

-du

Elimine secciones de jpeg que no sean Exif, que no comenten y que, de lo contrario, tampoco contribuyan a la imagen, como los datos que Photoshop podría dejar en la imagen.

-purejpg

Elimine todas las secciones JPEG que no sean necesarias para representar la imagen. Elimina cualquier metadato que varias aplicaciones puedan haber dejado en la imagen. Una combinación de las -de -dcy -du opciones.

Toby Speight
fuente
La etiqueta de rotación podría considerarse como "necesaria para representar la imagen".
Jeff
1
debe ser claro, pero solo funciona para archivos JPEG
serv-inc
6

Iría con ImageMagick para la mayoría de las imágenes. Esto se debe a que las diferentes implementaciones de la biblioteca producirán diferentes resultados comprimidos, ImageMagick puede realizar una unificación de compresión.

Los tipos comunes son fáciles porque el sistema operativo tiene bibliotecas para leerlos y escribirlos. Entonces:

find . -type f -name '*.jp*g' -o -type f -name '*.JP*G' \
       -exec mogrify -strip -taint -compress JPEG {} \;

find . -type f -name '*.png' -o -type f -name '*.PNG' \
       -exec mogrify -strip -taint -compress Lossless {} \;

find . -type f -name '*.gif' -o -type f -name '*.GIF' \
       -exec mogrify -strip -taint -compress LZW {} \;

Esto asegurará que tenga las imágenes escritas de la misma manera. Y luego puedes realizar:

find . -type f -regextype posix-extended \
       -regex ".*\.(jpe?g|JPE?G|png|PNG|gif|GIF)" \
       -exec md5sum {} \; > checksums
sort -k 1 checksums |
cut -d ' ' -f 1 |
uniq -d |
while read x; do
    grep $x checksums
done

Para los formatos RAW, creo que la única forma es hacer lo que Phil dice, y por lo tanto:

find . <blah blah> -exec exiftool -all= {} \;

Y luego la suma de comprobación sería la misma. Solo necesita cruzar los dedos para que los formatos de imagen más exóticos se puedan crear con una sola implementación (o tener un formato de archivo rígido).

Descargo de responsabilidad : Esto funcionará para comparar las sumas de verificación entre ellos. Si almacena las sumas de verificación y luego vuelve a ejecutarlas -stripdespués de una actualización zlibo libjpegpuede terminar con sumas de verificación completamente diferentes. Necesita construir las sumas de verificación para cada imagen cada vez. Dadas las preocupaciones sobre la calidad de la imagen, es aconsejable ejecutar esto solo una vez .

grochmal
fuente
Corrígeme si me equivoco. Supongamos que dos archivos representan la misma imagen pero se comprimen con dos bibliotecas diferentes. ¿No se 'descomprimirán' en diferentes píxeles porque jpg tiene pérdidas?
Jeff
1
A menudo no, JPEG2000 tiene un DCT bien definido, pero eso es solo la parte de la transformación de la imagen. La codificación huffman también debería ser la misma. Pero hasta donde llega el estándar, puede comprimir el resultado usando una biblioteca de compresión. En teoría, las bibliotecas de compresión (por ejemplo, zlib) siempre producirán resultados diferentes (incluso para el mismo algoritmo), pero la mayoría de las bibliotecas jpeg siembran el RNG de la misma manera para mantener las cosas sanas (por ejemplo, libjpeg hace esto).
grochmal
@Jeff El problema es bastante natural, ya que la pérdida significa que se pierde información.
aventurina
Por supuesto, si define una calidad de compresión diferente (por ejemplo -quality), todas las apuestas están desactivadas.
grochmal
Puede haber un problema con esta respuesta. Las etiquetas JFIF, incluida JFIFversion, se insertan mediante la opción imagemagick -strip. Para ver esto, ejecute exiftool -a -G1 -s <filename>en archivos creados con mogrify -stripy exiftool -all=. Para confirmar, corre exiftool -a -G1 -s <original-filename> | grep JFIF. Las ejecuciones futuras del script de alguna manera tendrían que tener esto en cuenta si la versión JFIF fuera diferente.
Jeff
5

Con el imagemagickpaquete y no solo para archivos JPEG , simplemente puede:

mogrify -strip *.jpg

Del manual :

-strip

Pele la imagen de cualquier perfil, comentario o estos fragmentos PNG: bKGD, cHRM, EXIF, gAMA, iCCP, iTXt, sRGB, tEXt, zCCP, zTXt, date.

Mucha más información y advertencias aquí .

Nota: Esto es similar a @grochmal pero mucho más directo y simple.

Pablo A
fuente
Según ese hilo, es mejor ir exiftool -all= *.jpga quitar datos jpg.
Walt W
0

Una posible solución que me vino a la mente. Evita el tema de los metadatos. Se supone que los archivos terminan con la imagen en sí, que todos los metadatos se encuentran al comienzo del archivo.

Vamos a referirnos a la unidad de respaldo actual como la unidad dorada.

Para imágenes en el disco de oro:

  1. Eliminar cualquier miniatura incrustada.
  2. Trocee el archivo comenzando en su extremo, disminuyendo, digamos, M = 100k bytes. Consulte la primera cola (que contiene el final del archivo) como el fragmento final.
  3. Calcule los md5sums de cada fragmento y guárdelos en una lista maestra llamada lista de oro.

Para imágenes en los discos viejos :

  1. Eliminar cualquier miniatura incrustada.
  2. Recorta los últimos M bytes de un archivo.
  3. Calcule su md5sum.
  4. CLASE U: si la suma no está en la lista de oro, concluya que el archivo es exclusivo de la unidad de oro. Cópielo en la unidad de oro. Calcule md5sums de fragmentos restantes y agréguelos a la lista de oro. Pase al siguiente archivo.
  5. De lo contrario, elimine los penúltimos M bytes. Pero si los bytes restantes son menores que, digamos, N = 50k, entonces no reduzca los bytes M. En su lugar, procese el resto como un trozo ligeramente sobredimensionado. N debe ser mayor que el espacio más grande consumido por las regiones de encabezado (excluidas las miniaturas).
  6. Calcule el md5sum del fragmento.
  7. Compare con la lista de oro, y así sucesivamente.
  8. CLASE D: Si las sumas de todos los fragmentos están en la lista de oro, concluya que es un duplicado.
  9. CLASE P: Si las sumas para todos los fragmentos, pero las últimas están en la lista de oro, concluya que probablemente sea un duplicado.

La Clase P contendrá imágenes que se encuentran en la unidad de disco de oro, pero que tienen exifdatos diferentes, o tienen corrupción / podredumbre de datos en los bytes iniciales de la imagen.

Cuando termine, examine la CLASE P de forma interactiva y compárelos con sus compañeros en el disco de oro.

Ver EDITAR # 3 a OP.

La asignación a las CLASES U y D debe ser 100% precisa.

El tamaño de CLASE P depende del tamaño de fragmento M, ya que los primeros bytes M + N de un archivo casi seguro contienen algunos datos de imagen (y todos los metadatos)

Jeff
fuente
Hice algo de formato de su publicación (por lo que utiliza enumeración de rebajas en lugar de párrafos abarrotados). Aún así, me parece bastante esotérico averiguar qué quieres decir con CLASE U, CLASE D, CLASE P ...
grochmal
asigne cada archivo de imagen en un disco duro antiguo a una de las tres clases U (nique), D (uplicate) P (duplicable)
Jeff
0

Si las unidades antiguas contienen principalmente duplicados (incluidos los metadatos), utilice dos pasos para encontrar los únicos como se define en el OP (que considera que dos archivos son duplicados incluso si difieren en los metadatos):

  1. Utilice md5sums de archivos intactos sin tirar para identificar qué archivos de las unidades antiguas son únicos (en este sentido alternativo) de la unidad de copia de seguridad actual, asignándolos a CLASE uU (sin tirar-Único) o CLASE D (upilcate). CLASE D será 100% precisa. CLASE uU debe ser pequeño (por supuesto) y contener una mezcla de verdaderos duplicados (en el sentido OP) y verdaderos únicos.

  2. Al trabajar con el pequeño conjunto de archivos, es decir, manejable, en CLASS uU, use md5sums y varias técnicas de eliminación para diseñar un método de comparación de archivos que sea útil para los propósitos establecidos en OP.

Jeff
fuente
0

Esto es un poco viejo, pero sí, exiftool funciona muy bien.

Mostrar metadatos de

exiftool photo.jpg

Mostrar metedata para todos los archivos * .jpg

Nota: La extensión distingue entre mayúsculas y minúsculas .

exiftool -ext jpg

Igual que el anterior, pero incluye subdirectorios.

exiftool -r -ext jpg .

Eliminar todos los metadatos

exiftool -all= -overwrite_original photo.jpg

Eliminar todos los metadatos de todos los archivos * .jpg en el directorio actual

exiftool -all= -overwrite_original -ext jpg 

Igual que el anterior, pero incluye subdirectorios.

exiftool -all= -r -overwrite_original -ext jpg .

Eliminar todos los metadatos GPS de archivos * .jpg en el directorio actual

exiftool -gps:all= *.jpg
RJ
fuente