¿Existe una herramienta para verificar la integridad del archivo de una serie de imágenes?

A veces, cuando está descargando una imagen y la conexión se interrumpe a mitad de la transmisión, se queda con una imagen medio descargada. Si intentas verlo, obtienes la parte superior de la imagen y la parte inferior suele ser de color gris o verde o de algún otro color. En otras palabras, está corrupto.

¿Hay alguna manera de verificar si la imagen está dañada de esa manera o si está dañada de otra manera?

Respuestas (5)

Si está hablando de archivos JPEG, entonces la utilidad jpeginfo es exactamente lo que está buscando. Puede verificar archivos en busca de diferentes tipos de errores y corrupción de JPEG y devolver un código de error (lo más útil para las secuencias de comandos), o simplemente eliminar archivos con errores.

Lo uso como parte de mi transferencia de archivos inicial, para asegurarme de que todo se copie correctamente sin depender de la verificación manual. (Después de eso, me aseguro de que sus sumas de verificación no cambien como parte de mi protección normal de copia de seguridad/bitrot).

El programa es de línea de comandos y viene como código fuente, pero debería ser fácil de construir y usar en cualquier distribución de Linux o en una Mac con un entorno de desarrollo configurado correctamente. Estoy seguro de que incluso podría hacerlo en Windows con Cygwin o MinGW. (Por ejemplo, aunque no puedo garantizar su integridad, esta publicación de blog parece legítima e incluye una descarga precompilada). Para crearlo usted mismo:

$ git clone https://github.com/tjko/jpeginfo.git
Cloning into 'jpeginfo'...
[...]
Checking connectivity... done
$ cd jpeginfo/
$ ./configure && make

Esto debería crear un jpeginfocomando que puede ejecutar en el lugar o copiar donde desee (posiblemente usando make install).

Luego, lo ejecutas así:

$ ./jpeginfo -c *.jpg
test1.jpg 1996 x 2554 24bit Exif  P 6582168  [OK]
test2.jpg 1996 x 2554 24bit Exif  P 6582116  Premature end of JPEG file  [WARNING]
test3.jpg  Corrupt JPEG data: 1 extraneous bytes before marker 0xe2 1996 x 2554 24bit Exif  P 6582169  [WARNING]

Aquí, test1.jpg está perfectamente bien, y test2.jpg borré algunos bytes del final, y test3.jpg cambié algunos bytes aleatorios en el encabezado.

Si tiene archivos RAW, consulte esta página de la Sociedad Estadounidense de Fotógrafos de Medios sobre validación DNG , o una sobre detalles de validación de datos , que cubre el uso del convertidor DNG de Adobe para validar por lotes formatos RAW patentados. (Desafortunadamente, esta es una operación de GUI y no necesariamente se puede programar fácilmente).

Si tiene una cámara que genera de forma nativa la versión 1.2 de DNG, eso es aún mejor, ya que incluye una suma de verificación MD5 incorporada de los datos de la imagen. Desafortunadamente, esto no parece estar almacenado con los metadatos de imagen normales, o al menos exiftool y exiv2 no lo reconocen, y en general leen archivos 1.2 DNG, lo que significa que, hasta donde yo sé, actualmente la validación de Adobe La herramienta es la única forma de aprovechar eso también.

¿Sabes si los binarios de Windows para jpeginfo existen en alguna parte?
El uso de la herramienta jpeginfo por git clone no parece ser posible en Windows, porque 'aux' parece ser un nombre reservado de Windows, y git no puede clonar el directorio mencionado anteriormente.
--- retomando la conversación de la otra publicación aquí; Descomprimir el archivo da un error debido a 'aux'. Cambiar el nombre de 'aux' dentro del archivo ayudó a descomprimir y luego cambiarle el nombre a 'aux' dentro de cygwin resolvió ese problema. Pero ejecutar make desde cygwin aún resultó en numerosos errores; algo sobre wrjpgcom.c:87:54: advertencia: declaración implícita incompatible de la función integrada 'salir' [habilitada de forma predeterminada] #define ERREXIT(msg) (fprintf(stderr, "%s\n", msg), exit (EXIT_FAILURE)) (solo uno de muchos)
@ldigas Creé un binario MinGW que puede encontrar en mattdm.org/misc/jpeginfo-w32/jpeginfo.exe . Construí esto en Linux como un ejecutable de compilación cruzada, por lo que no lo probé, pero pareció funcionar bien . No puedo prometer que funcione, pero prometo que es solo el código original y no tiene virus ni nada. :)
Voté esto hace unos minutos por el esfuerzo que está haciendo, pero no parece funcionar tan bien en Windows. jpeginfo -c any_jpeg_file.jpg Lo proporciono, parece informar Finalización prematura del archivo JPEG El flujo de datos JPEG no contiene ninguna imagen [ERROR].
Mirando el código de jpeginfo, no parece hacer mucho, pero busca algunos valores en los datos EXIF. También es súper viejo. Estoy seguro de que hay mejores alternativas (ver mi respuesta a continuación). el código fuente: github.com/tjko/jpeginfo/blob/master/jpeginfo.c

Si no se trata de descargar imágenes de su cámara, sino de una transferencia de computadora a computadora, un enfoque común para la integridad de los archivos son las sumas de verificación .

Desafortunadamente, hasta donde yo sé, los formatos de imagen comunes del "usuario final" (jpeg, png, gif,...) no se verifican por sí solos. Pero como entiendo que la pregunta implica un procesamiento automatizado, la integración de herramientas de suma de comprobación ( CRC32 , MD5 , …) en el flujo de trabajo podría ser una solución viable. Un enfoque común para almacenar la suma de verificación es tener un archivo con el mismo nombre de archivo, solo con una extensión agregada, como: img123.jpg → img123.jpg.md5.

Este enfoque tiene el beneficio adicional de que también puede verificar la integridad de (por ejemplo) archivos sidecar o cualquier otra cosa que desee transferir en un mecanismo similar. Y si mantiene los archivos de suma de comprobación, incluso en el futuro. (Y tiene la desventaja de no estar integrado en PS, LR u otras herramientas comunes en la medida de mi conocimiento limitado).

Vale la pena señalar que DNG contiene una suma de verificación y se puede verificar directamente en Lightroom.
¡Yo no era consciente de eso! Excelente. También tiene sentido. Edité la respuesta para aclarar que apunté a formatos de "usuario final" más que a formatos de archivo, aunque es bueno que DNG ayude con las sumas de verificación.
Utilizo el "Verificador de suma de comprobación avanzada" (ACSV) de Irnis Haliullin para calcular los archivos de suma de comprobación MD5 que se copian en un medio de copia de seguridad junto con los archivos originales. ACSV se ejecuta en lote o interactivo. La integridad de la copia se puede verificar en cualquier momento volviendo a calcular la suma de verificación y comparándola con el original.

ImageVerifier hizo lo que querías. Desafortunadamente, ya no está disponible para su descarga y el soporte se suspendió el 31 de diciembre de 2017 (ver Ingestamatic e ImageVerifier ya no están a la venta ).

Respuesta antigua por razones históricas.

ImageVerifier (IV para abreviar) atraviesa una jerarquía de carpetas en busca de archivos de imagen para verificar. Puede verificar TIFF, JPEG. PSD, DNG y crudos que no son DNG (p. ej., NEF, CR2).

IV está diseñado para procesar un gran número de imágenes. Las jerarquías de carpetas con 100.000 imágenes o más no deberían ser un problema. En una ejecución de prueba, IV funcionó durante 14 horas.

Hay dos tipos de verificación que realiza IV: verificación de estructura y verificación de hash.

http://basepath.com/site/detail-ImageVerifier.php

Parece que está asociado con ImageVerifier, si es así, ¿puede revelar esto en su respuesta?
No estoy asociado con el producto en absoluto. Necesitaba verificar algunos archivos de imagen después de un bloqueo del NAS y usé esta herramienta. Acabo de cortar y pegar el texto del sitio para dar una descripción.
FWIW: es bueno para archivos de cámara (jpg y varios formatos RAW, su principal uso previsto), pero no tan bueno para otros tipos de archivos sin códecs, etc. La función de identificación de ImageMagick es otra opción.

Desarrollé check_media_integrity un simple script de python check_mi.py, puedes descargarlo de GitHub:

https://github.com/ftarlao/check-media-integridad

Cito la introducción de la guía:

check-mi es un script de Python 2.7 que verifica automáticamente la integridad de los archivos multimedia (imágenes, video, audio). Puede verificar la integridad de un solo archivo o conjunto de archivos en una carpeta y subcarpetas de forma recursiva, finalmente, opcionalmente puede generar la lista de archivos defectuosos con su ruta y detalles en formato CSV.

La herramienta prueba la integridad de los archivos utilizando bibliotecas comunes (Pillow, ImageMagik, FFmpeg) y verifica cuándo pueden decodificar efectivamente los archivos multimedia. Los formatos de advertencia, imagen, audio y video son muy resistentes a defectos y daños, por lo que la herramienta no puede detectar todos los archivos dañados.

check-mi es capaz, con 100% de confianza, de detectar archivos que tienen encabezados/metadatos rotos, archivos de imagen truncados (con nivel_estricto >0) y errores de E/S del dispositivo.

check-mi, por lo general, no puede detectar todos los daños menores, por ejemplo, una pequeña parte del archivo multimedia sobrescrito con diferentes valores. En detalle, probé el nivel 1 estricto con un pequeño experimento aleatorio, ejecutado en una sola imagen jpeg de 5 MB:

Al sobrescribir una parte (intervalo) del archivo de imagen con ceros, necesita un tamaño de intervalo = 1024 KBytes para tener un 50 % de posibilidades de detectar el daño. Al sobrescribir una parte (intervalo) del archivo de imagen con diferentes valores aleatorios, obtiene una tasa de detección de aproximadamente el 85%, para tamaños de intervalo que van desde 4096 bytes hasta 1024 Kbytes.

En caso de que conozca formas de instruir a Pillow, Wand y FFmpeg para que sean más estrictos al decodificar, dígamelo.

La respuesta aceptada se refiere al uso de jpeginfo, que es una herramienta realmente antigua y sin mantenimiento escrita en C (y tampoco muy modular/extensible). Además, esa herramienta parece buscar solo algunos puntos de datos EXIF ​​específicos (revise el código fuente durante ~5 minutos).

En mi opinión, una mejor herramienta llamada tipo de archivo es muy fácil de usar; básicamente, copie y pegue su código de ejemplo y modifique el nombre del archivo si no sabe cómo codificar. Comprueba los números mágicos asociados con ciertos tipos de archivos conocidos y le permite saber con qué tipo de archivo está tratando.

Todavía estoy buscando más capas de protección que solo esto. Por ejemplo, si se almacenan datos arbitrarios más allá (o en) los metadatos EXIF, o después de los números mágicos, eso puede plantear problemas de seguridad. Continuaré buscando más medidas de seguridad y espero actualizar esta respuesta más tarde.

Aquí está el código de ejemplo copiado de su página web, para los perezosos:

// Node.js
const readChunk = require('read-chunk');
const fileType = require('file-type');

const buffer = readChunk.sync('unicorn.png', 0, fileType.minimumBytes);

fileType(buffer);
//=> {ext: 'png', mime: 'image/png'}

Para su información, esta herramienta se actualiza constantemente (hace 3 días fue la última actualización, según mi respuesta original aquí), y actualmente tienen 3,691,850 descargas semanales, por lo que probablemente sea una buena indicación.

Los identificadores de tipo de archivo típicos basados ​​en números mágicos generalmente solo se enfocan en los primeros n bytes, por lo que esto podría no ayudar con un archivo de imagen parcialmente comprometido, que es la base de la pregunta planteada aquí. Es decir, es muy común tener un archivo JPEG o PNG sobre el que POSIX file(que funciona de la misma manera) informará correctamente, pero no se procesará porque faltan muchos de los datos.