Como remover metadados de arquivos de imagem

8

[ EDIT # 1 por OP: Acontece que esta questão é bem respondida pelo criador / mantenedor do exiftool Phil Harvey em um thread duplicado no fórum do ExifTool ]

[ EDIT # 2 por OP: De FAQ do ExifTool : ExifTool não garante a remoção completa de metadados de um arquivo ao tentar excluir todos os metadados. Veja 'Limitações do gravador'.]

Gostaria de pesquisar meus discos rígidos antigos por fotos que não estão na minha unidade de backup atual. Os formatos incluem jpg, png, tif, etc ..., bem como vários formatos brutos (diferentes modelos de câmeras e fabricantes).

Estou interessado apenas na exclusividade da imagem em si e não na singularidade devido a diferenças, digamos, nos valores das tags exif, na presença / ausência de uma determinada tag exif, nas miniaturas incorporadas, etc ...

Mesmo que eu não espere encontrar nenhum corrompimento / corrupção de dados entre diferentes cópias de imagens idênticas, eu gostaria de detectar isso, assim como as diferenças devido ao redimensionamento e às mudanças de cor.

[ Editar # 3 por OP: Para esclarecimento: Uma pequena porcentagem de falsos positivos é tolerável (um arquivo é considerado exclusivo quando não é) e os falsos negativos são altamente indesejáveis (um arquivo é erroneamente concluído para ser uma duplicata).]

Meu plano é identificar a exclusividade com base no md5sums depois de eliminar todos os metadados.

Como posso remover os metadados?

exiftool -all= <filename> será suficiente?

    
por Jeff 27.09.2016 / 19:09

4 respostas

7

jhead tem a capacidade de remover metadados sem imagem de arquivos JPEG. A página man diz:

-dc

Delete comment field from the JPEG header. Note that the comment is not part of the Exif header.

-de

Delete the Exif header entirely. Leaves other metadata sections intact.

-di

Delete the IPTC section, if present. Leaves other metadata sections intact.

-dx

Delete the XMP section, if present. Leaves other metadata sections intact.

-du

Delete sections of jpeg that are not Exif, not comment, and otherwise not contributing to the image either - such as data that photoshop might leave in the image.

-purejpg

Delete all JPEG sections that aren't necessary for rendering the image. Strips any metadata that various applications may have left in the image. A combination of the -de -dc and -du options.

    
por 28.09.2016 / 16:27
2

Eu usaria o ImageMagick para a maioria das imagens. Isso ocorre porque diferentes implementações de biblioteca produzirão resultados compactados diferentes, o ImageMagick pode realizar uma unificação de compactação.

Os tipos comuns são fáceis porque o sistema operacional possui bibliotecas para lê-los e gravá-los. Então:

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 {} \;

Isso garantirá que você tenha as imagens gravadas da mesma maneira. E então você pode executar:

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 os formatos RAW, acredito que a única maneira é fazer o que o Phil diz e, portanto:

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

E então o checksum seria o mesmo. Você só precisa cruzar os dedos para que os formatos de imagem mais exóticos possam ser criados com uma única implementação (ou ter um formato de arquivo rígido).

Aviso de isenção : isso funcionará para comparar as somas de verificação entre si. Se você armazenar as somas de verificação e executar novamente o -strip após uma atualização de zlib ou libjpeg , poderá terminar com somas de verificação completamente diferentes. Você precisa construir as somas de verificação para cada imagem toda vez. Dadas as preocupações sobre a qualidade da imagem, é aconselhável executar apenas uma vez .

    
por 27.09.2016 / 22:16
0

Uma possível solução que me veio à mente. Evita a questão dos metadados. Ele assume que os arquivos terminam com a própria imagem, que todos os metadados estão no início do arquivo.

Vamos nos referir à unidade de backup atual como a unidade de ouro.

Para imagens no disco dourado:

  1. Remova qualquer miniatura incorporada.
  2. Pedaça o arquivo começando no final diminuindo, digamos, M = 100k bytes. Consulte a primeira parte final (que contém o final do arquivo) como o bloco final.
  3. Calcule os md5sums de cada fragmento e armazene-os em uma lista mestra chamada goldlist.

Para imagens nas unidades antigas :

  1. Remova qualquer miniatura incorporada.
  2. Diminuir o último M bytes de um arquivo.
  3. Calcule seu md5sum.
  4. CLASSE U: Se a soma não estiver na lista de ouro, conclua que o arquivo é exclusivo da unidade de ouro. Copie-o para a unidade de ouro. Calcule md5sums de pedaços restantes e adicione-os à lista de ouro. Vá para o próximo arquivo.
  5. Caso contrário, reduza o segundo para o último M bytes. Mas se os bytes restantes forem menores que, digamos, N = 50k, então não retire os M bytes. Em vez disso, processe o restante como um pedaço ligeiramente superdimensionado. N precisa ser maior que o maior espaço consumido pelas regiões de cabeçalho (excluídas as miniaturas).
  6. Calcule o md5sum do fragmento.
  7. Compare a goldlist e assim por diante.
  8. CLASSE D: Se as somas de todos os pedaços estiverem na lista de ouro, conclua que é uma duplicata.
  9. CLASSE P: Se as somas de todas as partes, mas as últimas, estiverem na lista de ouro, conclua que é provavelmente uma duplicata.

A classe P conterá imagens que estão no gold-drive, mas possuem exifdata diferentes ou têm corrupção / data-rot nos bytes iniciais da imagem.

Quando terminar, examine a CLASSE P de forma interativa, comparando-os com seus companheiros na unidade de ouro.

Veja EDIT # 3 to OP.

A atribuição em CLASSE U e D deve ser 100% precisa.

O tamanho da CLASSE P depende do tamanho do bloco M, uma vez que os primeiros bytes M + N de um arquivo quase certamente contêm alguns dados de imagem (e todos os metadados)

    
por 28.09.2016 / 02:49
0

Se as unidades antigas contiverem principalmente duplicados (incluindo metadados), use duas etapas para localizar os únicos, conforme definido no OP (que considera dois arquivos duplicados, mesmo que difiram nos metadados):

  1. Use md5sums de arquivos unstripped intactos para identificar quais arquivos nas unidades antigas são exclusivos (neste sentido alternativo) para a unidade de backup atual, atribuindo-os a CLASS uU (unstripped-Unique) ou CLASS D (upilcate ). A CLASSE D será 100% precisa. A CLASSE uU deve ser pequena (acima da suposição) e conter uma mistura de duplicatas verdadeiras (no sentido OP) e verdadeiras únicas.

  2. Trabalhando com o pequeno conjunto de arquivos em CLASS uU, use md5sums e várias técnicas de decapagem para projetar um método de comparação de arquivos que seja útil para propósitos estabelecidos no OP.

por 28.09.2016 / 22:23