Görüntü dosyalarından meta veriler nasıl şeritlenir


18

[ OP tarafından EDIT # 1: Bu sorunun exiftool yaratıcısı / koruyucusu Phil Harvey tarafından ExifTool Forumundaki yinelenen bir dizide oldukça iyi yanıtlandığını ortaya koyuyor ]

[ OP tarafından EDIT # 2: Gönderen ExifTool SSS : ExifTool edilir değil tüm meta silmeye çalışırken bir dosyadan tamamen meta kaldırmak için garantili. Bkz. 'Yazar Sınırlamaları'.]

Eski sabit disklerimi mevcut yedek diskimde olmayan fotoğraflar için aramak istiyorum. Formatlar arasında jpg, png, tif, vs ... ve çeşitli ham formatlar (farklı kamera modelleri ve üreticileri) bulunmaktadır.

Ben sadece görüntünün tekliği ve mesela exif etiketlerinin değerleri, belirli bir exif etiketinin varlığı / yokluğu, gömülü küçük resimler, vb.

Başka türlü özdeş görüntülerin farklı kopyaları arasında herhangi bir bozulma / veri çürümesi beklemememe rağmen, bunu yeniden boyutlandırmak ve renk değişikliklerinden kaynaklanan farklılıkları tespit etmek istiyorum.

[ OP ile # 3'ü düzenle: Açıklama için: Yanlış pozitiflerin küçük bir yüzdesi tolere edilebilir (bir dosya, olmadığı zaman benzersiz olduğu sonucuna varılır) ve yanlış negatifler son derece istenmeyen bir durumdur (bir dosya yanlış bir şekilde kopya olduğu sonucuna varılır). ]

Planım, herhangi bir meta veriyi soyduktan sonra md5sums'a dayalı benzersizliği tanımlamaktır.

Meta verileri nasıl çıkarabilirim?

Will exiftool -all= <filename>yeterli?


1
JPEG sıkıştırma kitaplıkları farklı şekillerde sıkıştırılır, bu nedenle, tüm meta verileri kaldırsanız bile, farklı bir JPEG uygulamasıyla sıkıştırıldığı için farklı bir sağlama toplamı olan aynı görüntüyle sonlandırabilirsiniz. Tüm resimleri aynı kitaplığı kullanarak yeniden kaydetmeniz gerekir (bu da kaliteyi biraz düşürebilir). Ayrıca tüm resimleri nasıl bulmayı planlıyorsunuz? fileRAW görüntü formatlarını keşfedemez ve findyalnızca uzantılarda çalışır (sahip olduklarınızı daha iyi tanımlamak yararlı olabilir)
grochmal

Bir sürü diğer soneklerin find $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"olduğu yerleri kullanıyorum <...>.
Jeff

Farklı sıkıştırma kütüphaneleri hakkında iyi bir nokta.
Jeff

1
BMP normalize edilmiş görüntülerin convert image.jpg - | md5sum(ImageMagick) size uygun MD5 toplamları sağlayıp sağlamadığını deneyebilirsiniz .
aventurin

1
Algısal olarak benzer iki görüntünün karşılaştırılması için yararlı olduğu phash adı verilen algısal bir karma algoritması vardır. stackoverflow'un burada bir etiketi var stackoverflow.com/questions/tagged/phash Artık iki dosyayı karşılaştıran bir araca sahip olmak yararlıdır, ancak tüm eşleşmeleri bulmak için O (n * n) işine sahip olabilir. Muhtemelen daha iyisini yapan iş akışları vardır, ancak bir hazırlıksız bilmiyorum. Ancak phash, sizi birine götürebilecek bir kırıntıdır. Görünüşe imagemagick phash destek çeşit vardır
sabitlendikten

Yanıtlar:


12

jheadJPEG olmayan dosyalardan resim olmayan meta verileri kaldırma özelliğine sahiptir. Man sayfası diyor ki:

-dc

Yorum başlığını JPEG üstbilgisinden silin. Yorumun Exif başlığının bir parçası olmadığını unutmayın.

-de

Exif başlığını tamamen silin. Diğer meta veri bölümlerini olduğu gibi bırakır.

-di

Varsa, IPTC bölümünü silin. Diğer meta veri bölümlerini olduğu gibi bırakır.

-dx

Varsa, XMP bölümünü silin. Diğer meta veri bölümlerini olduğu gibi bırakır.

-du

Jpeg'in Exif olmayan, yorum yapmayan ve görüntüye başka bir şekilde katkıda bulunmayan bölümlerini silin (örneğin, photoshop'un görüntüde bırakabileceği veriler gibi).

-purejpg

Görüntüyü oluşturmak için gerekli olmayan tüm JPEG bölümlerini silin. Görüntüde çeşitli uygulamaların bırakabileceği tüm meta verileri çıkarır. -de -dcVe -du seçeneklerinin bir kombinasyonu .


Döndürme etiketi 'görüntüyü oluşturmak için gerekli'
Jeff

1
net olmalı, ancak yalnızca JPEG dosyaları için çalışır
serv-inc

7

Çoğu görüntü için ImageMagick ile giderdim. Bunun nedeni, farklı kütüphane uygulamalarının farklı sıkıştırılmış sonuçlar üretmesidir, ImageMagick bir sıkıştırma birleştirme gerçekleştirebilir.

İşletim sistemi bunları okumak ve yazmak için kütüphanelere sahip olduğu için yaygın türler kolaydır. Yani:

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

Bu, görüntülerin aynı şekilde yazılmasını sağlar. Ve sonra şunları yapabilirsiniz:

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

RAW formatları için tek yolun Phil'in söylediği gibi yapmak olduğuna inanıyorum ve bu nedenle:

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

Ve sonra kontrol toplamı aynı olurdu. Tek bir uygulama ile (veya katı bir dosya formatına sahip) daha egzotik görüntü formatlarının oluşturulabilmesi için parmaklarınızı çaprazlamanız yeterlidir.

Feragatname : Bu, sağlama toplamlarını kendi aralarında karşılaştırmak için çalışacaktır. Sağlama toplamlarını depolar ve ardından -stripbir güncellemeden sonra yeniden çalıştırırsanız zlibveya libjpegtamamen farklı sağlama toplamlarıyla bitirebilirsiniz. Her seferinde her resim için sağlama toplamı oluşturmanız gerekir. Görüntü kalitesiyle ilgili endişeler göz önüne alındığında, bunu yalnızca bir kez çalıştırmak akıllıca olacaktır .


Eğer yanılıyorsam düzelt. İki dosyanın aynı görüntüyü temsil ettiğini, ancak iki farklı kitaplıkla sıkıştırıldığını varsayalım. Jpg kayıp olduğu için farklı piksellere 'sıkıştırmazlar' mı?
Jeff

1
Çoğu zaman, JPEG2000 iyi tanımlanmış bir DCT'ye sahiptir, ancak bu sadece görüntüyü dönüştürmenin bir parçasıdır. Huffman kodlaması da aynı olmalıdır. Ama bu standart kadarıyla, bir sıkıştırma kütüphanesi kullanarak sonucu sıkıştırabilirsiniz. Teoride, sıkıştırma kütüphaneleri (örneğin zlib) her zaman farklı sonuçlar üretecektir (aynı algoritma için bile), ancak çoğu jpeg kütüphanesi RNG'yi işleri aklı başında tutmak için aynı şekilde tohumlar (örn. Libjpeg bunu yapar).
grochmal

@Jeff Kayıp, bilginin kaybolduğu anlamına geldiğinden sorun oldukça doğaldır.
aventurin

Elbette farklı sıkıştırma kalitesi tanımlarsanız (örn. -quality) Tüm bahisler kapalıdır.
grochmal

Bu cevapla ilgili bir sorun olabilir. JFIFversion dahil JFIF etiketleri imagemagick seçeneği ile eklenir-strip . Bunu görmek exiftool -a -G1 -s <filename>için mogrify -stripve ile oluşturulan dosyalarda çalıştırın exiftool -all=. Onaylamak için çalıştırın exiftool -a -G1 -s <original-filename> | grep JFIF. JFIF sürümü farklıysa, betiğin gelecekteki çalışmalarının bir şekilde bunu dikkate alması gerekir.
Jeff

6

İle imagemagickpaket ve sadece JPEG için basitçe yapabilirsiniz:

mogrify -strip *.jpg

Gönderen manuel :

-strip

profillerin, yorumların veya şu PNG parçalarının resmini çıkarın: bKGD, cHRM, EXIF, gAMA, iCCP, iTXt, sRGB, tEXt, zCCP, zTXt, tarih.

Burada çok daha fazla bilgi ve uyarılar var .

Not: Bu @grochmal'e benzer, ancak çok daha basit ve basittir.


Bu iş parçacığına göre, exiftool -all= *.jpgjpg verilerini şeritlemek için daha iyi .
Walt W

0

Akla gelen olası bir çözüm. Meta veri sorununu ortadan kaldırır. Dosyaların görüntünün kendisiyle bittiği, tüm meta verilerin dosyanın başında olduğu varsayılır.

Mevcut yedekleme sürücüsüne altın sürücü olarak bakalım.

Altın diskteki görüntüler için:

  1. Katıştırılmış küçük resimleri kaldırın.
  2. Diyelim ki M = 100k byte'lık bir kuyruk bırakarak dosyayı sonuna kadar toplayın. Son yığın olarak ilk dosyanın (dosyanın sonunu içeren) bakın.
  3. Her bir yığının md5 toplamlarını hesaplayın ve goldlist adı verilen bir ana listede saklayın.

Eski sürücülerdeki görüntüler için :

  1. Katıştırılmış küçük resimleri kaldırın.
  2. Son M bayt bir dosyayı kuyruk.
  3. MD5 toplamını hesaplayın.
  4. SINIF U: Toplam altın listesinde yoksa, dosyanın altın sürücüye özgü olduğu sonucuna varın. Altın sürücüye kopyalayın. Kalan parçaların md5 toplamlarını hesaplayın ve bunları altın listeye ekleyin. Bir sonraki dosyaya git.
  5. Aksi takdirde, ikinciyi son M bayttan kuyruklayın. Ancak kalan baytlar, örneğin N = 50k'den azsa, M baytlarından kuyruk almayın. Bunun yerine, geri kalanını biraz büyük boyutlu bir yığın olarak işleyin. N'nin başlık bölgeleri tarafından tüketilen en büyük alandan daha büyük olması gerekir (küçük resimler hariç).
  6. Yığının md5sum değerini hesaplayın.
  7. Goldlist ile karşılaştırın vb.
  8. SINIF D: Tüm parçalar için toplamlar altın listede ise, bunun bir kopya olduğu sonucuna varın.
  9. SINIF P: Sonuncusu hariç tüm parçalar için toplamlar altın listede ise, muhtemelen bunun bir kopya olduğu sonucuna varın .

P Sınıfı, altın sürücüdeki ancak farklı exifdata içeren veya görüntünün önde gelen baytlarında bozulma / veri çürüğü olan görüntüler içerecektir.

Bittiğinde, CLASS P'yi etkileşimli olarak inceleyin ve onları altın sürücüdeki arkadaşlarıyla karşılaştırın.

Bkz. OP.

SINIF U ve D'ye atama% 100 doğru olmalıdır.

CLASS P'nin boyutu, M boyutunun yığın boyutuna bağlıdır, çünkü bir dosyanın ilk M + N baytları neredeyse kesinlikle bazı görüntü verileri (ve tüm meta veriler) içerir


Yayınınızın biçimlendirmesini yaptım (bu yüzden tıkalı paragraflar yerine etiketleme numaralandırması kullanır). Yine de SINIF U, SINIF D, SINIF P ile ne demek istediğini anlamak oldukça ezoterik buluyorum
grochmal

eski bir sabit diskteki her bir görüntü dosyasını üç U (nique), D (yinelenen) P (oldukça yinelenen) sınıfından birine atayın
Jeff

0

Eski sürücüler çoğunlukla kopyalar (meta veriler dahil) içeriyorsa, OP'de tanımlanan benzersizleri bulmak için iki adım kullanın (bu, meta verilerde farklı olsalar bile iki dosyanın kopya olduğunu düşünür):

  1. Eski sürücülerdeki hangi dosyaların geçerli yedek sürücüye benzersiz olduğunu (bu alternatif anlamda) CLASS uU'ya (soyulmamış-Benzersiz) veya CLASS D'ye (yukarı doğru) atamak için bozulmamış md5sums değerlerini kullanın. SINIF D% 100 doğru olacaktır. SINIF uU küçük olmalıdır (yukarıdaki varsayımla) ve gerçek kopyaların (OP Duygusunda) ve gerçek benzersizlerin bir karışımını içermelidir.

  2. CLASS uU'daki küçük, yani yönetilebilir dosya kümesiyle çalışırken, OP'de belirtilen amaçlar için yararlı bir dosya karşılaştırma yöntemi tasarlamak için md5sums ve çeşitli sıyırma tekniklerini kullanın.


0

Bu biraz eski, ama evet, exiftool çok iyi çalışıyor.

Meta verilerini göster

exiftool photo.jpg

Tüm * .jpg dosyaları için metedata göster

Not: Uzantı büyük / küçük harfe duyarlıdır .

exiftool -ext jpg

Yukarıdaki ile aynı, ancak alt dizinleri içerir.

exiftool -r -ext jpg .

Tüm meta verileri kaldır

exiftool -all= -overwrite_original photo.jpg

Geçerli dizindeki tüm * .jpg dosyalarının tüm meta verilerini kaldır

exiftool -all= -overwrite_original -ext jpg 

Yukarıdaki ile aynı, ancak alt dizinleri içerir.

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

Geçerli dizindeki * .jpg dosyalarının tüm GPS meta verilerini kaldırın

exiftool -gps:all= *.jpg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.