Có một công cụ để kiểm tra tính toàn vẹn tập tin của một loạt các hình ảnh?


21

Đôi khi, khi bạn đang tải xuống một hình ảnh và kết nối bị đứt giữa dòng, bạn chỉ còn lại một nửa hình ảnh được tải xuống. Nếu bạn cố gắng xem nó, bạn sẽ có được phần trên của hình ảnh và phần dưới cùng thường có màu xám hoặc xanh lá cây hoặc một số màu khác. Nói cách khác, nó bị hỏng.

Có cách nào để kiểm tra xem hình ảnh có bị hỏng theo cách đó hay bị hỏng không?

Câu trả lời:


15

Nếu bạn đang nói về các tệp JPEG, thì tiện ích jpeginfo chính xác là thứ bạn đang tìm kiếm. Nó có thể kiểm tra các tệp cho các loại lỗi và lỗi JPEG khác nhau và trả về mã lỗi (điều hữu ích nhất cho tập lệnh) hoặc chỉ xóa các tệp có lỗi.

Tôi sử dụng điều này như là một phần của việc chuyển tập tin ban đầu của tôi, để đảm bảo mọi thứ được sao chép ổn mà không cần dựa vào kiểm tra thủ công. (Sau đó, tôi đảm bảo rằng tổng kiểm tra của họ không thay đổi như là một phần của bảo vệ sao lưu / bitrot thông thường của tôi.)

Chương trình này là dòng lệnh và có mã nguồn, nhưng nó có thể dễ dàng xây dựng và sử dụng trên bất kỳ bản phân phối Linux nào hoặc trên máy Mac có môi trường phát triển được thiết lập đúng. Tôi chắc rằng bạn thậm chí có thể làm điều đó trên Windows với Cygwin hoặc MinGW. (Ví dụ: mặc dù tôi không thể đảm bảo tính toàn vẹn của nó, bài đăng trên blog này có vẻ hợp pháp và bao gồm tải xuống được biên dịch trước.) Để tự xây dựng nó:

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

Điều này sẽ tạo ra một jpeginfolệnh mà bạn có thể chạy tại chỗ hoặc sao chép bất cứ nơi nào bạn muốn (có thể sử dụng make install).

Sau đó, bạn chạy nó như thế này:

$ ./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]

Ở đây, test1.jpg hoàn toàn ổn và test2.jpg Tôi đã xóa một vài byte từ cuối và test3.jpg Tôi đã thay đổi một số byte ngẫu nhiên trong tiêu đề.

Nếu bạn có tệp RAW, hãy xem trang này từ Hiệp hội nhiếp ảnh gia truyền thông Hoa Kỳ về Xác thực DNG hoặc một trong các chi tiết xác thực dữ liệu , bao gồm sử dụng trình chuyển đổi DNG của Adobe để xác thực các định dạng RAW độc quyền hàng loạt. (Thật không may, đây là một hoạt động GUI và không nhất thiết phải có kịch bản dễ dàng.)

Nếu bạn có một máy ảnh thực sự xuất ra phiên bản 1.2 của DNG, điều đó thậm chí còn tốt hơn, vì điều này bao gồm tổng kiểm tra MD5 tích hợp của dữ liệu hình ảnh. Thật không may, điều này dường như không được lưu trữ với siêu dữ liệu hình ảnh thông thường - hoặc ít nhất là exiftool và exiv2 không nhận ra nó và nói chung họ đọc các tệp 1.2 DNG - có nghĩa là theo như tôi biết hiện tại là xác thực Adobe công cụ là cách duy nhất để tận dụng lợi thế đó.


Bạn có biết liệu nhị phân Windows cho jpeginfo tồn tại ở đâu đó không?
Rook

1
Sử dụng công cụ jpeginfo của git clone dường như không thể thực hiện được trên Windows, bởi vì 'aux' dường như là một tên dành riêng cho Windows và git không thể sao chép thư mục nói trên vào sự tồn tại.
Rook

--- nối lại cuộc trò chuyện từ bài đăng khác ở đây; Giải nén tệp lưu trữ sẽ báo lỗi vì 'phụ'. Đổi tên 'aux' trong kho lưu trữ đã giúp giải nén và sau đó đổi tên lại thành 'aux' trong cygwin đã giải quyết vấn đề đó. Nhưng chạy make từ cygwin vẫn dẫn đến nhiều lỗi vẫn còn; một cái gì đó về wrjpgcom.c: 87: 54: (EXIT_FAILURE)) (chỉ là một trong số rất nhiều)
Rook

@ldigas Tôi đã xây dựng một nhị phân MinGW mà bạn có thể tìm thấy tại mattdm.org/misc/jpeginfo-w32/jpeginfo.exe . Tôi đã xây dựng cái này trên Linux dưới dạng thực thi được biên dịch chéo, vì vậy chưa thử nghiệm nó, nhưng nó dường như được xây dựng ổn. Tôi không thể hứa rằng nó hoạt động, nhưng tôi hứa rằng đó chỉ là mã ngược dòng và không có virus hay bất cứ thứ gì. :)
mattdm

Đã nâng cấp điều này một vài phút trước cho nỗ lực bạn đang thực hiện, nhưng dường như nó không hoạt động tốt trên Windows. jpeginfo -c any_jpeg_file.jpg Tôi cung cấp nó, dường như báo cáo Kết thúc sớm của tệp JPEG Kho dữ liệu JPEG không chứa hình ảnh [ERROR].
Rook

2

ImageVerifier đã làm những gì bạn muốn. Thật không may, nó không có sẵn để tải xuống nữa và hỗ trợ đã bị ngừng vào ngày 31 tháng 12 năm 2017 (xem Ingestamatic và ImageVerifier không còn để bán ).

Câu trả lời cũ vì lý do lịch sử

ImageVerifier (viết tắt là IV) đi qua một hệ thống phân cấp các thư mục đang tìm kiếm tệp hình ảnh để xác minh. Nó có thể xác minh TIFF, JPEG. PSD, DNG và nguyên liệu không DNG (ví dụ: NEF, CR2).

IV được thiết kế để xử lý số lượng lớn hình ảnh. Hệ thống phân cấp thư mục có 100.000 hình ảnh trở lên sẽ không có vấn đề gì. Trong một lần chạy thử, IV đã chạy trong 14 giờ.

Có hai loại xác minh mà IV thực hiện: Kiểm tra cấu trúc và kiểm tra băm.

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


Có vẻ như bạn được liên kết với ImageVerifier, nếu vậy, bạn có thể vui lòng tiết lộ điều này trong câu trả lời của mình không.
sự thật đáng nguyền rủa

1
Tôi không liên quan đến sản phẩm nào cả. Tôi đã cần xác minh một số tệp hình ảnh sau sự cố NAS và sử dụng công cụ này. Tôi chỉ cắt dán văn bản từ trang web để đưa ra một mô tả.
Kez

FWIW - Nó tốt cho các tệp máy ảnh (jpg và các định dạng RAW khác nhau - mục đích sử dụng chính của nó) nhưng không tốt cho các loại tệp khác không có codec, v.v. Chức năng xác định của ImageMagick là một tùy chọn khác
Kez

1

Nếu đây không phải là về việc tải xuống hình ảnh từ máy ảnh của bạn, mà là chuyển từ máy tính sang máy tính, một cách tiếp cận phổ biến đối với tính toàn vẹn của tệp là tổng kiểm tra .

Thật không may, theo như tôi biết, các định dạng hình ảnh "người dùng cuối" phổ biến (jpeg, png, gif, mật) không được tự kiểm tra tính toàn vẹn. Nhưng theo tôi hiểu câu hỏi ngụ ý xử lý tự động, việc tích hợp các công cụ tổng kiểm tra ( CRC32 , MD5 , cám ) vào quy trình làm việc có thể là một giải pháp khả thi. Một cách tiếp cận phổ biến để lưu trữ tổng kiểm tra là có một tệp có cùng tên tệp, chỉ với một phần mở rộng được thêm vào, như : img123.jpg → img123.jpg.md5.

Cách tiếp cận này có thêm lợi ích là bạn cũng có thể kiểm tra tính toàn vẹn của (ví dụ) các tệp sidecar hoặc bất kỳ thứ gì khác mà bạn muốn chuyển trong một cơ chế tương tự. Và nếu bạn giữ các tập tin tổng kiểm tra xung quanh, ngay cả trong tương lai. (Và nó có nhược điểm là không được tích hợp trong PS, LR hoặc các công cụ phổ biến khác trong phạm vi kiến ​​thức hạn chế của tôi.)


1
Điều đáng chú ý là DNG có chứa tổng kiểm tra và có thể được xác minh trực tiếp trong Lightroom.
Hampus Nilsson

Tôi đã không nhận thức được điều đó! Xuất sắc. Làm cho ý nghĩa, quá. Tôi đã chỉnh sửa câu trả lời để làm rõ hơn Tôi nhắm đến các định dạng "người dùng cuối" nhiều hơn các định dạng lưu trữ, mặc dù thật ngọt ngào khi DNG giúp kiểm tra tổng.
Cornelius

Tôi sử dụng "Trình kiểm tra tổng kiểm tra nâng cao" (ACSV) của Irni Haliullin, để tính toán các tệp tổng kiểm MD5 được sao chép vào phương tiện sao lưu cùng với các tệp gốc. ACSV chạy theo đợt hoặc tương tác. Tính toàn vẹn của bản sao có thể được xác minh bất cứ lúc nào bằng cách tính lại tổng kiểm tra và so sánh với bản gốc.
Pierre

1

Tôi đã phát triển check_media_integrity một tập lệnh python đơn giản check_mi.py, bạn có thể tải xuống từ GitHub:

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

Tôi trích dẫn phần giới thiệu:

check-mi là tập lệnh Python 2.7 tự động kiểm tra tính toàn vẹn của các tệp phương tiện (hình ảnh, video, âm thanh). Bạn có thể kiểm tra tính toàn vẹn của một tệp hoặc tập hợp các tệp trong thư mục và các thư mục con theo cách đệ quy, cuối cùng bạn có thể tùy ý xuất danh sách các tệp xấu với đường dẫn và chi tiết của chúng ở định dạng CSV.

Công cụ kiểm tra tính toàn vẹn của tệp bằng các thư viện phổ biến (Gối, ImageMagik, FFmpeg) và kiểm tra khi nào chúng có thể giải mã hiệu quả các tệp phương tiện. Các định dạng cảnh báo, hình ảnh, âm thanh và video rất linh hoạt đối với các khiếm khuyết và thiệt hại vì lý do này công cụ có thể phát hiện tất cả các tệp bị hỏng.

kiểm tra mi có thể, với độ tin cậy 100%, để phát hiện các tệp bị hỏng tiêu đề / siêu dữ liệu, các tệp hình ảnh bị cắt bớt (vớirict_level> 0) và lỗi i / o của thiết bị.

thông thường, kiểm tra mi thường không thể phát hiện tất cả các thiệt hại nhỏ - ví dụ: một phần nhỏ của tệp phương tiện được ghi đè bằng các giá trị khác nhau. Cụ thể, tôi đã thử nghiệmrict_level 1 bằng một thử nghiệm ngẫu nhiên nhỏ, được thực hiện trên một hình ảnh jpeg 5 MB duy nhất:

Ghi đè một phần (khoảng) tệp hình ảnh bằng số không, bạn cần kích thước khoảng = 1024KBytes để có 50% cơ hội phát hiện thiệt hại. Ghi đè một phần (khoảng) tệp hình ảnh với các giá trị ngẫu nhiên khác nhau, bạn có được tỷ lệ phát hiện khoảng 85%, cho các kích thước khoảng từ 4096byte đến 1024Kbyte.

Trong trường hợp bạn biết cách hướng dẫn Gối, Wand và FFmpeg chặt chẽ hơn khi giải mã, xin vui lòng cho tôi biết.


0

Câu trả lời được chấp nhận đề cập đến việc sử dụng jpeginfo, đây là một công cụ thực sự cũ và không được bảo trì được viết bằng C (và cũng không phải là mô-đun / mở rộng). Ngoài ra, công cụ đó dường như chỉ tìm kiếm một số điểm dữ liệu EXIF ​​cụ thể (lướt qua mã nguồn trong ~ 5 phút).

IMO, một công cụ tốt hơn được gọi là loại tệp , rất dễ sử dụng - về cơ bản sao chép-dán mã ví dụ của họ và sửa đổi tên tệp nếu bạn không biết cách viết mã. Nó kiểm tra các số ma thuật liên quan đến các kiểu tệp đã biết và cho bạn biết loại tệp bạn đang xử lý.

Tôi vẫn đang tìm kiếm nhiều lớp bảo vệ hơn chỉ thế này. Chẳng hạn, nếu dữ liệu tùy ý được lưu trữ qua (hoặc trong) siêu dữ liệu EXIF ​​hoặc sau các số ma thuật, điều đó có thể gây ra các vấn đề bảo mật. Tôi sẽ tiếp tục xem xét các biện pháp bảo mật hơn và hy vọng sẽ cập nhật câu trả lời này sau.

Đây là mã ví dụ được sao chép từ trang web của họ, dành cho người lười biếng:

// 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, công cụ này liên tục được cập nhật (3 ngày trước là bản cập nhật cuối cùng, như câu trả lời ban đầu của tôi ở đây) và chúng hiện có 3.691.850 lượt tải xuống hàng tuần - vì vậy đó có lẽ là một dấu hiệu tốt.


Các mã định danh loại tệp dựa trên số ma thuật điển hình thường chỉ tập trung vào n byte đầu tiên, vì vậy điều này có thể không giúp ích gì với tệp hình ảnh được cam kết một phần, là cơ sở của câu hỏi được đặt ra ở đây. Đó là, rất phổ biến khi có một JPEG hoặc PNG mà POSIX file(hoạt động theo cách tương tự) sẽ báo cáo chính xác, nhưng sẽ không kết xuất được vì phần lớn dữ liệu thực sự bị thiếu.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.