Como retirar metadados dos arquivos de imagem

16

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

[ EDIT # 2 by OP: do ExifTool Perguntas frequentes : O ExifTool não garante a remoção completa de metadados de um arquivo ao tentar excluir todos os metadados. Consulte 'Limitações do gravador'.]

Gostaria de procurar nos meus discos rígidos antigos 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 e fabricantes de câmeras).

Estou interessado apenas na exclusividade da imagem em si e não na exclusividade devido a diferenças, por exemplo, 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 qualquer corrupção / roteamento de dados entre cópias diferentes de imagens idênticas, gostaria de detectar isso, bem como diferenças devido ao redimensionamento e alterações de cores.

[ Edit # 3 by OP: Para esclarecimento: Uma pequena porcentagem de falsos positivos é tolerável (um arquivo é considerado único quando não é) e os falsos negativos são altamente indesejáveis ​​(um arquivo é incorretamente concluído como duplicado). ]

Meu plano é identificar a exclusividade com base no md5sums após remover todos e quaisquer metadados.

Como posso retirar os metadados?

Será exiftool -all= <filename>suficiente?

Jeff
fonte
1
As bibliotecas de compactação JPEG são compactadas de maneiras diferentes; portanto, mesmo que você remova todos os metadados, você ainda pode terminar com a mesma imagem com uma soma de verificação diferente porque foi compactada com uma implementação JPEG diferente. Você precisará salvar novamente todas as imagens usando a mesma biblioteca (o que pode diminuir um pouco a qualidade). Além disso, como você planeja encontrar todas as imagens? filefalharão em descobrir os formatos de imagem RAW e findsó irá funcionar em extensões (pode ser útil para descrever melhor o que você tem)
grochmal
Eu tenho usado find $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"where <...>significa um monte de outros sufixos.
Jeff Jeff
Bom argumento sobre diferentes bibliotecas de compactação.
Jeff Jeff
1
Você pode tentar se as imagens normalizadas BMP convert image.jpg - | md5sum(ImageMagick) fornecem somas MD5 apropriadas.
Aventurin
1
Existe um algoritmo de hash perceptivo chamado phash que é útil para comparar como duas imagens são perceptivamente semelhantes. stackoverflow possui uma tag aqui stackoverflow.com/questions/tagged/phash Agora, é útil ter uma ferramenta que compara dois arquivos, mas pode levar ao trabalho O (n * n). para encontrar todas as correspondências. Provavelmente, existem fluxos de trabalho que se saem melhor, mas eu não conheço um de imediato. Mas phash é uma trilha de navegação que pode levar você a uma. Aparentemente, o imagemagick tem algum tipo de suporte a
phash

Respostas:

11

jheadtem a capacidade de remover metadados que não são de imagem de arquivos JPEG. A página do manual diz:

-dc

Exclua o campo de comentário do cabeçalho JPEG. Observe que o comentário não faz parte do cabeçalho Exif.

-de

Exclua o cabeçalho Exif completamente. Deixa outras seções de metadados intactas.

-di

Exclua a seção IPTC, se presente. Deixa outras seções de metadados intactas.

-dx

Exclua a seção XMP, se presente. Deixa outras seções de metadados intactas.

-du

Exclua seções do jpeg que não são Exif, não comentam e também não contribuem para a imagem - como dados que o photoshop pode deixar na imagem.

-purejpg

Exclua todas as seções JPEG que não são necessárias para renderizar a imagem. Retira todos os metadados que vários aplicativos podem ter deixado na imagem. Uma combinação das opções -de -dce -du.

Toby Speight
fonte
A tag de rotação pode ser considerada como 'necessária para renderizar a imagem'.
Jeff Jeff
1
deve ser claro, mas só funciona para JPEG arquivos
serv-inc
6

Eu iria com o ImageMagick para a maioria das imagens. Isso ocorre porque implementações de bibliotecas diferentes produzirão resultados compactados diferentes, o ImageMagick pode executar uma unificação de compactação.

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 Phil diz e, portanto:

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

E então a soma de verificação seria a mesma. Você só precisa pensar que os formatos de imagem mais exóticos podem ser criados com uma única implementação (ou ter um formato de arquivo rígido).

Isenção de responsabilidade : Isso funcionará para comparar as somas de verificação entre si. Se você armazenar as somas de verificação e, em seguida, execute novamente a -stripapós uma atualização zlibou libjpegpoderá terminar com somas de verificação completamente diferentes. Você precisa criar as somas de verificação para todas as imagens sempre. Dadas as preocupações com a qualidade da imagem, é aconselhável executar isso apenas uma vez .

grochmal
fonte
Me corrija se eu estiver errado. Suponha que dois arquivos representem a mesma imagem, mas foram compactados com duas bibliotecas diferentes. Eles não serão "descompactados" em pixels diferentes porque o jpg está com perdas?
Jeff Jeff
1
Geralmente, o JPEG2000 possui um DCT bem definido, mas essa é apenas a parte da transformação da imagem. A codificação huffman também deve ser a mesma. Mas, no que diz respeito ao padrão, você pode realmente comprimir o resultado usando uma biblioteca de compactação. Em teoria, as bibliotecas de compactação (por exemplo, zlib) sempre produzirão resultados diferentes (mesmo para o mesmo algoritmo), mas a maioria das bibliotecas jpeg semeiam o RNG da mesma maneira para manter as coisas saudáveis ​​(por exemplo, libjpeg faz isso).
grochmal 27/09/16
@ Jeff O problema é bastante natural, pois com perdas significa que as informações são perdidas.
Aventurin
Obviamente, se você definir uma qualidade de compactação diferente (por exemplo -quality), todas as apostas serão desativadas.
grochmal 27/09/16
Pode haver um problema com esta resposta. Tags JFIF, incluindo JFIFversion, são inseridas pela opção imagemagick -strip. Para ver isso, execute os exiftool -a -G1 -s <filename>arquivos criados com mogrify -stripe exiftool -all=. Para confirmar, execute exiftool -a -G1 -s <original-filename> | grep JFIF. As execuções futuras do script precisariam, de alguma forma, levar isso em conta se a versão do JFIF fosse diferente.
Jeff Jeff
5

Com o imagemagickpacote e não apenas para JPEGs, você pode simplesmente:

mogrify -strip *.jpg

Do manual :

-strip

retire a imagem de quaisquer perfis, comentários ou esses pedaços PNG: bKGD, cHRM, EXIF, gAMA, iCCP, iTXt, sRGB, texto, zCCP, zTXt, data.

Muito mais informações e advertências aqui .

Nota: Isso é semelhante ao @grochmal, mas muito mais direto e simples.

Pablo A
fonte
Conforme esse segmento, é melhor usar os exiftool -all= *.jpgdados jpg.
Walt W
0

Uma possível solução que veio à mente. Isso evita a questão dos metadados. Ele pressupõe que os arquivos terminem com a própria imagem, que todos os metadados estejam no início do arquivo.

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

Para imagens na unidade gold:

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

Para imagens nas unidades antigas :

  1. Remova qualquer miniatura incorporada.
  2. Retire os últimos 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 dos pedaços restantes e adicione-os à lista de ouro. Vá para o próximo arquivo.
  5. Caso contrário, reduza o penúltimo M bytes. Mas se os bytes restantes forem menores que, digamos, N = 50k, não diminua os M bytes. Em vez disso, processe o restante como um pedaço um pouco grande demais. N precisa ser maior que o maior espaço consumido pelas regiões do cabeçalho (miniaturas excluídas).
  6. Calcule o md5sum do pedaço.
  7. Compare a lista de ouro e assim por diante.
  8. CLASSE D: Se as somas de todos os blocos estiverem na lista de ouro, conclua que é uma duplicata.
  9. CLASSE P: Se as somas de todos os blocos, mas o último estiver na lista de ouro, conclua que provavelmente é uma duplicata.

A classe P conterá imagens que estão na unidade gold, mas têm exifdata diferentes ou têm corrupção / rotatividade de dados 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 a OP.

A atribuição nas CLASSES U e D deve ser 100% precisa.

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

Jeff
fonte
Fiz alguma formatação da sua postagem (por isso ela usa enumeração de remarcação em vez de parágrafos abarrotados). Ainda acho bastante esotérico descobrir o que você quer dizer com CLASSE U, CLASSE D, CLASSE P ...
grochmal
atribuir a cada arquivo de imagem em um disco rígido antigo para uma das três classes U (nique), D (uplicate) P (robably duplicar)
Jeff
0

Se as unidades antigas contiverem principalmente duplicatas (incluindo metadados), use duas etapas para encontrar os únicos, conforme definido no OP (que considera dois arquivos duplicados, mesmo que sejam diferentes em metadados):

  1. Use md5sums de arquivos não removidos intactos para identificar quais arquivos nas unidades antigas são únicos (nesse sentido alternativo) para a unidade de backup atual, atribuindo-os à CLASS uU (sem remoção exclusiva) ou à CLASSE D (upilcate). A CLASSE D será 100% precisa. CLASS uU deve ser pequeno (pela suposição acima) e conter uma mistura de duplicatas verdadeiras (no OP Sense) e únicas verdadeiras.

  2. Trabalhando com o pequeno, ou seja, gerenciável, conjunto de arquivos no CLASS uU, use md5sums e várias técnicas de remoção para projetar um método de comparação de arquivos que seja útil para os fins descritos no OP.

Jeff
fonte
0

Isso é um pouco antigo, mas sim, o exiftool funciona muito bem.

Mostrar metadados de

exiftool photo.jpg

Mostrar metedados para todos os arquivos * .jpg

Nota: A extensão diferencia maiúsculas de minúsculas .

exiftool -ext jpg

O mesmo que acima, mas inclui subdiretórios.

exiftool -r -ext jpg .

Remova todos os metadados

exiftool -all= -overwrite_original photo.jpg

Remova todos os metadados de todos os arquivos * .jpg no diretório atual

exiftool -all= -overwrite_original -ext jpg 

O mesmo que acima, mas inclui subdiretórios.

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

Remova todos os metadados GPS de arquivos * .jpg no diretório atual

exiftool -gps:all= *.jpg
RJ
fonte