Cara menghapus metadata dari file gambar

16

[ EDIT # 1 oleh OP: Ternyata pertanyaan ini cukup baik dijawab oleh pencipta / pengelola exiftool Phil Harvey dalam utas rangkap di Forum ExifTool ]

[ EDIT # 2 oleh OP: Dari ExifTool FAQ : ExifTool tidak dijamin untuk menghapus metadata sepenuhnya dari file ketika mencoba menghapus semua metadata. Lihat 'Keterbatasan Penulis'.]

Saya ingin mencari di hard drive lama saya untuk foto-foto yang tidak ada di drive cadangan saya saat ini. Format termasuk jpg, png, tif, dll ..., serta berbagai format mentah (model kamera dan pabrikan berbeda).

Saya hanya tertarik pada keunikan gambar itu sendiri dan bukan keunikan karena perbedaan dalam, katakanlah, nilai-nilai tag exif, ada / tidaknya tag exif yang diberikan itu sendiri, thumbnail yang disematkan, dll ...

Meskipun saya tidak berharap menemukan korupsi / pembusukan data antara salinan berbeda dari gambar yang identik, saya ingin mendeteksi itu, serta perbedaan karena perubahan ukuran dan perubahan warna.

[ Sunting # 3 oleh OP: Untuk klarifikasi: Sebagian kecil positif palsu dapat ditoleransi (file dianggap unik ketika tidak) dan negatif palsu sangat tidak diinginkan (file salah disimpulkan sebagai duplikat). ]

Rencana saya adalah mengidentifikasi keunikan berdasarkan md5sums setelah menghapus semua metadata.

Bagaimana saya bisa menghapus metadata?

Akankah exiftool -all= <filename>cukup?

Jeff
sumber
1
Pustaka kompresi JPEG memampatkan dengan cara yang berbeda, oleh karena itu, bahkan jika Anda menghapus semua metadata Anda masih dapat berakhir dengan gambar yang sama memiliki checksum yang berbeda karena dikompresi dengan implementasi JPEG yang berbeda. Anda perlu menyimpan kembali semua gambar menggunakan perpustakaan yang sama (yang mungkin agak menurunkan kualitas). Juga bagaimana Anda berencana untuk menemukan semua gambar? fileakan gagal menemukan format gambar RAW dan findhanya akan bekerja pada ekstensi (mungkin berguna untuk menggambarkan lebih baik apa yang Anda miliki)
grochmal
Saya telah menggunakan di find $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"mana <...>berarti banyak sufiks lainnya.
Jeff
Poin bagus tentang pustaka kompresi yang berbeda.
Jeff
1
Anda dapat mencoba jika BMP menormalkan gambar convert image.jpg - | md5sum(ImageMagick) memberi Anda jumlah MD5 yang sesuai.
aventurin
1
Ada algoritma hashing perseptual yang disebut phash yang berguna untuk membandingkan seberapa mirip dua gambar. stackoverflow memiliki tag di sini stackoverflow.com/questions/tagged/phash Sekarang memiliki alat yang membandingkan dua file berguna, tetapi mungkin mengarah pada pekerjaan O (n * n) .untuk menemukan semua kecocokan. Mungkin ada alur kerja yang lebih baik, tapi saya tidak tahu begitu saja. Tapi phash adalah remah roti yang bisa menuntunmu ke satu. Rupanya imagemagick memiliki semacam dukungan
phash

Jawaban:

11

jheadmemiliki kemampuan untuk menghapus metadata non-gambar dari file JPEG. Halaman manual mengatakan:

-dc

Hapus bidang komentar dari header JPEG. Perhatikan bahwa komentar tersebut bukan bagian dari tajuk Exif.

-de

Hapus tajuk Exif seluruhnya. Meninggalkan bagian metadata lain utuh.

-di

Hapus bagian IPTC, jika ada. Meninggalkan bagian metadata lain utuh.

-dx

Hapus bagian XMP, jika ada. Meninggalkan bagian metadata lain utuh.

-du

Hapus bagian jpeg yang bukan Exif, bukan komentar, dan selain itu tidak berkontribusi pada gambar - seperti data yang mungkin ditinggalkan photoshop dalam gambar.

-purejpg

Hapus semua bagian JPEG yang tidak perlu untuk menampilkan gambar. Strip setiap metadata yang mungkin ditinggalkan oleh berbagai aplikasi di dalam gambar. Kombinasi opsi -de -dcdan -du.

Toby Speight
sumber
Tag rotasi dapat dianggap 'perlu untuk rendering gambar'.
Jeff
1
harus jelas, tetapi hanya berfungsi untuk file JPEG
serv-inc
6

Saya akan menggunakan ImageMagick untuk sebagian besar gambar. Ini karena implementasi pustaka yang berbeda akan menghasilkan hasil kompresi yang berbeda, ImageMagick dapat melakukan penyatuan kompresi.

Jenis umum mudah karena OS memiliki perpustakaan untuk membaca dan menulisnya. Begitu:

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

Ini akan memastikan bahwa Anda memiliki gambar yang ditulis dengan cara yang sama. Dan kemudian Anda dapat melakukan:

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

Untuk format RAW saya percaya bahwa satu-satunya cara adalah melakukan seperti yang Phil katakan, dan karena itu:

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

Dan kemudian checksumnya akan sama. Anda hanya perlu menyilangkan jari agar format gambar yang lebih eksotis dapat dibuat dengan implementasi tunggal (atau memiliki format file yang kaku).

Penafian : Ini akan berfungsi untuk membandingkan checksum di antara mereka sendiri. Jika Anda menyimpan checksum dan menjalankannya kembali -stripsetelah pembaruan zlibatau libjpegAnda dapat mengakhiri dengan checksum yang sangat berbeda. Anda perlu membuat checksum untuk setiap gambar setiap saat. Mengingat kekhawatiran tentang kualitas gambar, sebaiknya jalankan ini hanya sekali .

grochmal
sumber
Koreksi saya jika saya salah. Misalkan dua file mewakili gambar yang sama tetapi dikompres dengan dua pustaka yang berbeda. Tidakkah mereka 'membuka kompresi' ke dalam piksel yang berbeda karena jpg lossy?
Jeff
1
Seringkali tidak, JPEG2000 memiliki DCT yang didefinisikan dengan baik, tetapi itu hanya bagian dari mengubah gambar. Pengodean huffman juga harus sama. Tapi itu sejauh standar berjalan, Anda kemudian dapat benar-benar mengompres hasilnya menggunakan pustaka kompresi. Dalam teori perpustakaan kompresi (misalnya zlib) akan selalu menghasilkan hasil yang berbeda (bahkan untuk algoritma yang sama), tetapi sebagian besar perpustakaan jpeg menambakan RNG dengan cara yang sama untuk menjaga hal-hal tetap waras (mis. Libjpeg melakukan ini).
grochmal
@ Jeff Masalahnya cukup alami karena lossy berarti informasi hilang.
aventurin
Tentu saja jika Anda menentukan kualitas kompresi yang berbeda (mis. -quality) Semua taruhan dimatikan.
grochmal
Mungkin ada masalah dengan jawaban ini. Tag JFIF, termasuk JFIFversion disisipkan oleh opsi imagemagick -strip. Untuk melihat ini, jalankan exiftool -a -G1 -s <filename>file yang dibuat dengan mogrify -stripdan exiftool -all=. Untuk mengonfirmasi, jalankan exiftool -a -G1 -s <original-filename> | grep JFIF. Menjalankan skrip di masa depan entah bagaimana harus mempertimbangkan ini jika versi JFIF berbeda.
Jeff
5

Dengan imagemagickpaket dan tidak hanya untuk JPEG, Anda cukup:

mogrify -strip *.jpg

Dari manual :

-strip

strip gambar profil, komentar atau potongan PNG ini: bKGD, cHRM, EXIF, gAMA, iCCP, iTXt, sRGB, tEXt, zCCP, zTXt, tanggal.

Lebih banyak info dan peringatan di sini .

Catatan: Ini mirip dengan @grochmal tetapi jauh lebih mudah dan sederhana.

Pablo A
sumber
Sesuai utas itu, lebih baik menggunakan exiftool -all= *.jpgdata jpg.
Walt W
0

Solusi yang mungkin muncul di benak saya. Ini mengesampingkan masalah metadata. Diasumsikan bahwa file berakhir dengan gambar itu sendiri, bahwa semua metadata ada di awal file.

Mari merujuk drive cadangan saat ini sebagai drive emas.

Untuk gambar pada drive emas:

  1. Hapus thumbnail yang disematkan.
  2. Memotong file mulai dari ujungnya dengan mengekor, katakanlah, M = 100k byte. Lihat tailing pertama (yang berisi ujung file) sebagai potongan-akhir.
  3. Hitung md5sums setiap chunk dan simpan dalam daftar master yang disebut goldlist.

Untuk gambar di drive lama :

  1. Hapus thumbnail yang disematkan.
  2. Ekor M byte terakhir file.
  3. Hitung md5sum-nya.
  4. CLASS U: Jika jumlahnya tidak ada dalam daftar emas, maka simpulkan file tersebut unik untuk drive-emas. Salin ke drive emas. Hitung md5sums potongan yang tersisa dan tambahkan ke daftar emas. Lanjutkan ke file berikutnya.
  5. Jika tidak, matikan M byte kedua hingga terakhir. Tetapi jika byte yang tersisa kurang dari, katakanlah, N = 50k, maka jangan batal M byte. Alih-alih memproses sisanya sebagai potongan yang agak besar. N harus lebih besar dari ruang terbesar yang dikonsumsi oleh wilayah header (thumbnail tidak termasuk).
  6. Hitung md5sum chunk.
  7. Bandingkan dengan goldlist, dan sebagainya.
  8. KELAS D: Jika jumlah semua potongan ada di daftar emas, maka simpulkan itu adalah duplikat.
  9. CLASS P: Jika jumlah untuk semua potongan tetapi yang terakhir ada dalam daftar emas, maka simpulkan itu mungkin duplikat.

Kelas P akan berisi gambar yang ada di drive emas, tetapi memiliki exifdata yang berbeda, atau memiliki korupsi / data-busuk dalam byte terkemuka gambar.

Setelah selesai, periksalah CLASS P secara interaktif, membandingkannya dengan teman mereka di drive emas.

Lihat EDIT # 3 untuk OP.

Penugasan ke CLASS U dan D harus 100% akurat.

Ukuran CLASS P tergantung pada ukuran chunk M, karena M + N byte pertama dari suatu file hampir pasti berisi beberapa data gambar (dan semua metadata)

Jeff
sumber
Saya melakukan beberapa pemformatan posting Anda (jadi menggunakan enumerasi markdown daripada paragraf penuh). Masih saya merasa cukup esoterik untuk mencari tahu apa yang Anda maksud dengan CLASS U, CLASS D, CLASS P ...
grochmal
tetapkan setiap file gambar pada hard drive lama ke salah satu dari tiga kelas U (nique), D (uplicate) P (duplikat yang dapat diubah-ubah)
Jeff
0

Jika drive lama sebagian besar berisi duplikat (termasuk metadata) maka gunakan dua langkah untuk menemukan uniques seperti yang didefinisikan dalam OP (yang menganggap dua file sebagai duplikat meskipun berbeda dalam metadata):

  1. Gunakan md5sums dari file yang tidak terhenti yang utuh untuk mengidentifikasi file mana pada drive lama yang unik (dalam pengertian alternatif ini) ke drive backup saat ini, menugaskannya ke CLASS uU (unstripped-Unique) atau CLASS D (upilcate). CLASS D akan menjadi 100% akurat. KELAS uU harus kecil (dengan asumsi di atas) dan berisi campuran duplikat sejati (dalam OP Sense) dan uniques sejati.

  2. Bekerja dengan yang kecil, yaitu dikelola, set file di CLASS uU, gunakan md5sums dan berbagai teknik pengupasan untuk merancang metode perbandingan file yang berguna untuk tujuan yang ditetapkan dalam OP.

Jeff
sumber
0

Ini agak tua, tapi ya, exiftool bekerja dengan sangat baik.

Tampilkan metadata dari

exiftool photo.jpg

Tampilkan metedata untuk semua file * .jpg

Catatan: Ekstensi ini peka huruf besar-kecil .

exiftool -ext jpg

Sama seperti di atas, tetapi termasuk sub direktori.

exiftool -r -ext jpg .

Hapus semua metadata

exiftool -all= -overwrite_original photo.jpg

Hapus semua metadata dari semua file * .jpg di direktori saat ini

exiftool -all= -overwrite_original -ext jpg 

Sama seperti di atas, tetapi termasuk sub direktori.

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

Hapus semua metadata GPS dari file * .jpg di direktori saat ini

exiftool -gps:all= *.jpg
RJ
sumber