Pregunta

Estoy creando una secuencia de comandos para encontrar eliminar duplicados en una gran biblioteca de imágenes. En este momento estoy haciendo un filtro de dos pasos para buscar primero archivos del mismo tamaño y luego hacer un sha256 en una pieza de 10240 bytes del archivo para obtener una huella digital de los archivos con el mismo tamaño (código here ).

Funciona bien, pero supongo que probablemente haya sumas de comprobación integradas en el formato jpeg que podría usar en lugar de hacer el sha256.

¿Alguien sabe si hay sumas de comprobación u otros componentes que podrían actuar como sumas de comprobación / huellas digitales? Si es así, ¿hay una manera eficiente de acceder a ellos?

¿Fue útil?

Solución

No creo que la especificación JPEG incluya ningún tipo de suma de comprobación en la forma en que estás describiendo.

Sin embargo, un JPEG puede contener una miniatura como parte de sus metadatos EXIF. No es un indicador perfecto, ya que es posible que dos imágenes diferentes tengan la misma miniatura. Hay al menos un caso documentado de una miniatura que no se reemplaza después de que la imagen haya sufrido modificaciones sustanciales, dicha miniatura revela mucho más de lo que pretendía el editor.

Otros consejos

Ha pasado un tiempo desde que busqué en la biblioteca de IJG, pero no creo que haya una función o un miembro de la clase fácil de usar que puedas usar allí para verificar algún tipo de huella digital. Podría usar las etiquetas EXIF ??integradas si puede controlar la codificación de las imágenes ...

Acabo de construir un script muy similar. No quiero hacer una comprobación de los metadatos. Quiero ver si las imágenes reales son duplicadas, incluso si las etiquetas se han modificado. Lo mejor para eso no es ordenar por tamaño, pero sí ordenar por la suma de comprobación. Uso jhead para eliminar los metadatos y luego sumo todo el archivo (pero también pensé en hacer una parte, pero en realidad no creo que ahorre mucho tiempo). jhead no usa memoria compartida (tuberías) y se sobrescribe, así que primero copio el archivo a la memoria compartida. Coloco la suma de comprobación en el campo ImageDescription para una recuperación más rápida más adelante. Obviamente, esto también permite verificar la integridad de la imagen más adelante y es parte de la razón por la que hago una suma de comprobación completa. Consejo: exiv2 es MUCHO más rápido para leer y escribir los metadatos que exiftool para una manipulación basada en decisiones a la vez.

En el estándar JPEG (UIT-T.81) creo que no hay ningún elemento de campo / sintaxis que tenga una suma de comprobación o similar, para todo el archivo de imagen jpeg comprimido. A menos que una aplicación personalizada coloque dicho archivo en el segmento de la Aplicación, o como metadatos para los segmentos que se proporcionan en la norma. Entonces, para servir a tu propósito, lo que estás haciendo es una solución. Otro podría ser algún tipo de envoltorio de aplicación que llame a algún archivo binario para comparar utlitiy (como indistintamente comparar, o incluso un comando de Windows fc / b ) y verifique el resultado de esa utilidad de comparación y tome la decisión u quiero.

-AD

Una forma en que podría actuar es reducir todas las imágenes a un tamaño fijo y almacenarlas como una miniatura. Luego, la comparación de imágenes compararía imágenes de tamaño similar y le daría la oportunidad de ser un duplicado, lo que es útil si ha recortado (a menos que haya recortado en gran medida) o redimensionado las imágenes y quiere encontrar esos "duplicados".

En la especificación XMP, hay un ID de documento y un ID de versión que deben identificar de forma única la versión de la imagen.

El problema con estos (y con cualquier otro método de identificación basado en metadatos) es que es posible que algunas aplicaciones no puedan respetar el contenido del jpeg actualizando los metadatos en consecuencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top