Apakah ada alat untuk memeriksa integritas file dari serangkaian gambar?

21

Kadang-kadang ketika Anda mengunduh gambar dan koneksi terputus di tengah aliran, Anda dibiarkan dengan gambar yang setengah diunduh. Jika Anda mencoba untuk melihatnya Anda mendapatkan bagian atas gambar dan bagian bawah biasanya berwarna abu-abu atau hijau atau warna lain. Dengan kata lain, itu rusak.

Apakah ada cara untuk memeriksa apakah gambarnya rusak atau rusak?

Benteng
sumber

Jawaban:

15

Jika Anda berbicara tentang file JPEG, maka utilitas jpeginfo persis seperti yang Anda cari. Itu dapat memeriksa file untuk berbagai jenis kesalahan JPEG dan korupsi dan mengembalikan kode kesalahan (hal yang paling berguna untuk skrip), atau hanya menghapus file dengan kesalahan.

Saya menggunakan ini sebagai bagian dari transfer file awal saya, untuk memastikan semuanya disalin baik-baik saja tanpa mengandalkan pemeriksaan manual. (Setelah itu, saya memastikan checksum mereka tidak berubah sebagai bagian dari cadangan / perlindungan bitrot normal saya.)

Program ini adalah command-line, dan datang sebagai kode sumber, tetapi harus mudah dibuat dan digunakan pada distribusi Linux atau pada Mac dengan lingkungan pengembangan yang diatur dengan benar. Saya yakin Anda bahkan dapat melakukannya di Windows dengan Cygwin atau MinGW. (Misalnya, meskipun saya tidak dapat menjamin integritasnya, posting blog ini tampaknya sah dan menyertakan unduhan yang dikompilasi sebelumnya.) Untuk membuatnya sendiri:

$ git clone https://github.com/tjko/jpeginfo.git
Cloning into 'jpeginfo'...
[...]
Checking connectivity... done
$ cd jpeginfo/
$ ./configure && make

Ini harus membuat jpeginfoperintah yang bisa Anda jalankan di tempat atau menyalin di mana pun Anda inginkan (mungkin menggunakan make install).

Kemudian, Anda menjalankannya seperti ini:

$ ./jpeginfo -c *.jpg
test1.jpg 1996 x 2554 24bit Exif  P 6582168  [OK]
test2.jpg 1996 x 2554 24bit Exif  P 6582116  Premature end of JPEG file  [WARNING]
test3.jpg  Corrupt JPEG data: 1 extraneous bytes before marker 0xe2 1996 x 2554 24bit Exif  P 6582169  [WARNING]

Di sini, test1.jpg baik-baik saja, dan test2.jpg Saya menghapus beberapa byte dari akhir, dan test3.jpg Saya mengubah beberapa byte acak di header.

Jika Anda memiliki file RAW, periksa halaman ini dari American Society of Media Photographer di DNG Validation , atau satu di detail validasi data , yang mencakup menggunakan konverter DNG Adobe untuk mem-batch-memvalidasi format RAW eksklusif. (Sayangnya, ini adalah operasi GUI dan tidak harus dengan mudah skrip.)

Jika Anda memiliki kamera yang secara asli menampilkan versi 1.2 DNG, itu lebih baik, karena ini termasuk built-in MD5 checksum dari data gambar. Sayangnya, ini sepertinya tidak disimpan dengan metadata gambar normal - atau setidaknya exiftool dan exiv2 tidak mengenalinya, dan mereka membaca 1.2 file DNG secara umum - yang berarti sejauh yang saya tahu saat ini validasi Adobe Alat adalah satu-satunya cara untuk memanfaatkan itu juga.

mattdm
sumber
Apakah Anda tahu apakah binari Windows untuk jpeginfo ada di suatu tempat?
Benteng
1
Menggunakan alat jpeginfo oleh git clone tampaknya tidak mungkin dilakukan pada Windows, karena 'aux' tampaknya merupakan nama yang dicadangkan oleh Windows, dan git tidak dapat mengkloning direktori yang telah disebutkan sebelumnya.
Benteng
--- melanjutkan percakapan dari pos lain di sini; Membuka ritsleting arsip memberikan kesalahan karena 'aux'. Mengganti nama 'aux' di dalam arsip membantu unzip dan kemudian mengganti namanya kembali ke 'aux' di cygwin memecahkan masalah itu. Tapi menjalankan make dari cygwin masih menghasilkan banyak kesalahan; sesuatu tentang wrjpgcom.c: 87: 54: peringatan: deklarasi implisit yang tidak kompatibel dari fungsi bawaan 'keluar' [diaktifkan secara default] #define ERREXIT (msg) (fprintf (stderr, "% s \ n", msg), keluar (EXIT_FAILURE)) (hanya satu dari banyak)
Rook
@ldigas Saya membuat biner MinGW yang dapat Anda temukan di mattdm.org/misc/jpeginfo-w32/jpeginfo.exe . Saya membangun ini di Linux sebagai executable lintas-dikompilasi, jadi belum mengujinya, tetapi tampaknya membangun oke. Saya tidak bisa menjanjikan itu berfungsi, tetapi saya berjanji bahwa itu hanya kode upstream dan tidak memiliki virus atau apa pun. :)
mattdm
Diperbaharui ini beberapa menit yang lalu untuk upaya yang Anda lakukan, tetapi tampaknya tidak bekerja dengan baik pada Windows. jpeginfo -c any_jpeg_file.jpg Saya berikan, sepertinya melaporkan akhir file JPEG Prematur JPEG datastream tidak mengandung gambar [KESALAHAN].
Benteng
2

ImageVerifier melakukan apa yang Anda inginkan. Sayangnya itu tidak tersedia untuk diunduh lagi dan dukungan telah dihentikan pada 31-Desember-2017 (lihat Ingestamatic dan ImageVerifier tidak lagi dijual ).

Jawaban lama karena alasan historis

ImageVerifier (IV singkatnya) melintasi hierarki folder yang mencari file gambar untuk diverifikasi. Itu dapat memverifikasi TIFF, JPEG. PSD, DNG, dan raw non-DNG (misalnya, NEF, CR2).

IV dirancang untuk memproses gambar dalam jumlah besar. Hirarki folder dengan 100.000 gambar atau lebih seharusnya tidak menjadi masalah. Dalam satu uji coba, IV berlari selama 14 jam.

Ada dua jenis verifikasi yang dilakukan IV: Memeriksa struktur dan memeriksa hash.

http://basepath.com/site/detail-ImageVerifier.php

Kez
sumber
Sepertinya Anda terkait dengan ImageVerifier, jika demikian, dapatkah Anda mengungkapkan hal ini dalam jawaban Anda.
kebenaran terkutuk
1
Saya tidak terkait dengan produk sama sekali. Saya harus memverifikasi beberapa file gambar setelah NAS crash dan menggunakan alat ini. Saya baru saja memotong teks yang disisipkan dari situs untuk memberikan deskripsi.
Kez
FWIW - Ini bagus untuk file kamera (jpg dan berbagai format RAW - penggunaan utamanya dimaksudkan) tetapi tidak begitu baik untuk jenis file lain tanpa codec, dll. Fungsi -identify dari ImageMagick adalah pilihan lain
Kez
1

Jika ini bukan tentang mengunduh gambar dari kamera Anda, tetapi transfer komputer ke komputer, pendekatan umum untuk integritas file adalah checksum .

Sayangnya, sejauh yang saya tahu, format gambar "pengguna akhir" yang umum (jpeg, png, gif, ...) tidak diperiksa integritasnya sendiri. Tetapi ketika saya memahami pertanyaan untuk menyiratkan pemrosesan otomatis, mengintegrasikan alat checksum ( CRC32 , MD5 , ...) ke dalam alur kerja bisa menjadi solusi yang layak. Pendekatan yang umum untuk menyimpan checksum adalah untuk memiliki sebuah file dengan nama file yang sama, hanya dengan ekstensi yang ditambahkan, seperti: img123.jpg → img123.jpg.md5.

Pendekatan ini memiliki manfaat tambahan yaitu Anda juga dapat memeriksa integritas (misalnya) file sespan atau hal lain yang ingin Anda transfer dalam mekanisme yang sama. Dan jika Anda menyimpan file checksum di sekitar, bahkan di masa depan. (Dan itu memiliki kelemahan dari tidak terintegrasi dalam PS, LR, atau alat umum lainnya sejauh pengetahuan saya terbatas.)

Cornelius
sumber
1
Perlu dicatat bahwa DNG memang mengandung checksum, dan dapat diverifikasi langsung di Lightroom.
Hampus Nilsson
Aku tidak menyadari itu sebelumnya! Luar biasa. Masuk akal juga. Saya mengedit jawaban untuk membuat lebih jelas saya bertujuan untuk format "pengguna akhir" lebih dari format arsip, meskipun manis bahwa DNG membantu dengan checksum.
Cornelius
Saya menggunakan "Advanced Checksum Verifier" (ACSV) oleh Irnis Haliullin, untuk menghitung file MD5 checksum yang disalin ke media cadangan bersama dengan file asli. ACSV berjalan secara batch atau interaktif. Integritas salinan dapat diverifikasi kapan saja dengan menghitung ulang checksum, dan membandingkannya dengan aslinya.
Pierre
1

Saya mengembangkan check_media_integrity skrip python sederhana check_mi.py, Anda dapat mengunduhnya dari GitHub:

https://github.com/ftarlao/check-media-integrity

Saya mengutip panduan intro:

check-mi adalah skrip Python 2.7 yang secara otomatis memeriksa integritas file media (gambar, video, audio). Anda dapat memeriksa integritas satu file, atau mengatur file dalam folder dan subfolder secara rekursif, akhirnya Anda secara opsional dapat menampilkan daftar file yang buruk dengan path mereka dan detail dalam format CSV.

Alat ini menguji integritas file menggunakan perpustakaan umum (Bantal, ImageMagik, FFmpeg) dan memeriksa kapan mereka secara efektif dapat men-decode file media. Format peringatan, gambar, audio dan video sangat tahan terhadap cacat dan kerusakan karena alasan ini alat tidak dapat mendeteksi semua file yang rusak.

check-mi mampu, dengan kepercayaan diri 100%, untuk menemukan file yang rusak header / metadata, file gambar terpotong (dengan strict_level> 0), dan kesalahan perangkat i / o.

check-mi biasanya tidak dapat mendeteksi semua kerusakan kecil - misalnya sebagian kecil file media yang ditimpa dengan nilai yang berbeda. Secara detail, saya telah menguji strict_level 1 dengan eksperimen acak kecil, dijalankan pada gambar jpeg 5MB tunggal:

Menimpa sebagian (interval) file gambar dengan angka nol, Anda perlu ukuran interval = 1024KBytes untuk mendapatkan 50% kemungkinan mendeteksi kerusakan. Menimpa sebagian (interval) file gambar dengan nilai acak berbeda, Anda memperoleh rasio deteksi sekitar 85%, untuk ukuran interval mulai dari 4096bytes hingga 1024Kbytes.

Jika Anda tahu cara untuk menginstruksikan Pillow, Wand dan FFmpeg agar lebih ketat saat decoding, tolong beri tahu saya.

Fabiano Tarlao
sumber
0

Jawaban yang diterima mengacu pada penggunaan jpeginfo, yang merupakan alat yang benar-benar tua dan tidak terawat yang ditulis dalam C (dan juga tidak sangat modular / dapat diperluas). Juga, alat itu tampaknya hanya mencari beberapa titik data EXIF ​​tertentu (membaca kode sumber selama ~ 5 menit).

IMO, alat yang lebih baik disebut, tipe file , sangat mudah digunakan - pada dasarnya salin-tempel kode contoh mereka dan modifikasi nama file jika Anda tidak tahu bagaimana cara membuat kode. Ini memeriksa nomor ajaib yang terkait dengan tipe file tertentu yang diketahui dan memungkinkan Anda mengetahui jenis file yang Anda hadapi.

Saya masih mencari lebih banyak lapisan perlindungan dari ini. Misalnya, jika data sewenang-wenang disimpan melewati (atau dalam) metadata EXIF, atau setelah angka ajaib, itu dapat menimbulkan masalah keamanan. Saya akan terus mencari langkah-langkah keamanan yang lebih dan berharap untuk kemudian memperbarui jawaban ini.

Inilah contoh kode yang disalin dari halaman web mereka, untuk yang malas:

// Node.js
const readChunk = require('read-chunk');
const fileType = require('file-type');

const buffer = readChunk.sync('unicorn.png', 0, fileType.minimumBytes);

fileType(buffer);
//=> {ext: 'png', mime: 'image/png'}

FYI, alat ini terus diperbarui (3 hari yang lalu adalah pembaruan terakhir, seperti jawaban asli saya di sini), dan mereka saat ini memiliki 3.691.850 unduhan mingguan - jadi itu mungkin indikasi yang baik.

pengguna3773048
sumber
Pengidentifikasi tipe file berdasarkan angka ajaib biasanya hanya fokus pada n byte pertama, jadi ini mungkin tidak membantu dengan file gambar yang dilakukan sebagian, yang merupakan dasar dari pertanyaan yang diajukan di sini. Yaitu, sangat umum untuk memiliki JPEG atau PNG yang POSIX file(yang beroperasi dengan cara yang sama) akan melaporkan dengan benar, tetapi akan gagal untuk membuat karena banyak data yang sebenarnya hilang.