Cách tách siêu dữ liệu khỏi tệp hình ảnh


16

[ EDIT # 1 của OP: Hóa ra câu hỏi này được trả lời khá tốt bởi người tạo / bảo trì exiftool Phil Harvey trong một chủ đề trùng lặp trên Diễn đàn ExifTool ]

[ EDIT # 2 bởi OP: Từ ExifTool FAQ : ExifTool không được bảo đảm để xóa hoàn toàn siêu dữ liệu khỏi tệp khi cố gắng xóa tất cả siêu dữ liệu. Xem 'Giới hạn nhà văn'.]

Tôi muốn tìm kiếm các ổ đĩa cứng cũ của tôi để tìm những bức ảnh không có trên ổ đĩa sao lưu hiện tại của tôi. Các định dạng bao gồm jpg, png, tif, v.v ..., cũng như các định dạng thô khác nhau (các kiểu máy ảnh và nhà sản xuất khác nhau).

Tôi chỉ quan tâm đến tính độc đáo của hình ảnh chứ không phải tính duy nhất do sự khác biệt trong các giá trị của thẻ exif, sự hiện diện / vắng mặt của chính thẻ exif đã cho, hình thu nhỏ được nhúng, v.v ...

Mặc dù tôi không mong muốn tìm thấy bất kỳ sự hỏng hóc / dữ liệu nào giữa các bản sao khác nhau của các hình ảnh giống hệt nhau, tôi muốn phát hiện ra điều đó, cũng như sự khác biệt do thay đổi kích thước và thay đổi màu sắc.

[ Chỉnh sửa # 3 bởi OP: Để làm rõ: Một tỷ lệ nhỏ dương tính giả có thể chấp nhận được (một tệp được kết luận là duy nhất khi không) và các phủ định sai rất không mong muốn (một tệp bị kết luận sai là trùng lặp). ]

Kế hoạch của tôi là xác định tính duy nhất dựa trên md5sums sau khi tước bất kỳ và tất cả siêu dữ liệu.

Làm cách nào để loại bỏ siêu dữ liệu?

Sẽ exiftool -all= <filename>đủ?


1
Do đó, các thư viện nén JPEG nén theo nhiều cách khác nhau, ngay cả khi bạn loại bỏ tất cả siêu dữ liệu, bạn vẫn có thể kết thúc với cùng một hình ảnh có một tổng kiểm tra khác vì nó được nén bằng cách triển khai JPEG khác. Bạn sẽ cần lưu lại tất cả các hình ảnh bằng cùng một thư viện (điều này có thể làm giảm chất lượng phần nào). Ngoài ra làm thế nào để bạn có kế hoạch để tìm tất cả các hình ảnh? filesẽ không thể khám phá các định dạng hình ảnh RAW và findsẽ chỉ hoạt động trên các tiện ích mở rộng (có thể hữu ích để mô tả tốt hơn những gì bạn có)
hóa học

Tôi đã sử dụng find $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"nơi <...>có nghĩa là aa loạt các hậu tố khác.
Jeff

Điểm tốt về các thư viện nén khác nhau.
Jeff

1
Bạn có thể thử nếu hình ảnh chuẩn hóa BMP convert image.jpg - | md5sum(ImageMagick) cung cấp cho bạn số tiền MD5 phù hợp.
aventurin

1
Có một thuật toán băm nhận thức được gọi là phash mà nó hữu ích để so sánh mức độ giống nhau của hai hình ảnh. stackoverflow có một thẻ ở đây stackoverflow.com/questions/tagged/phash Bây giờ có một công cụ so sánh hai tệp là hữu ích, nhưng có thể dẫn đến việc O (n * n). để tìm tất cả các kết quả khớp. Có thể có các quy trình công việc làm tốt hơn, nhưng tôi không biết một cách trực tiếp. Nhưng phash là một mẩu bánh mì có thể dẫn bạn đến một. Rõ ràng hình ảnh tưởng tượng có một số loại hỗ trợ
phash

Câu trả lời:


11

jheadcó khả năng loại bỏ siêu dữ liệu không phải hình ảnh khỏi các tệp JPEG. Trang người đàn ông nói:

-dc

Xóa trường nhận xét khỏi tiêu đề JPEG. Lưu ý rằng nhận xét không phải là một phần của tiêu đề Exif.

-de

Xóa hoàn toàn tiêu đề Exif. Giữ nguyên các phần siêu dữ liệu khác.

-di

Xóa phần IPTC, nếu có. Giữ nguyên các phần siêu dữ liệu khác.

-dx

Xóa phần XMP, nếu có. Giữ nguyên các phần siêu dữ liệu khác.

-du

Xóa các phần của jpeg không phải là Exif, không bình luận và nếu không sẽ không đóng góp cho hình ảnh - chẳng hạn như dữ liệu mà photoshop có thể để lại trong ảnh.

-purejpg

Xóa tất cả các phần JPEG không cần thiết để hiển thị hình ảnh. Loại bỏ bất kỳ siêu dữ liệu nào mà các ứng dụng khác nhau có thể để lại trong hình ảnh. Một sự kết hợp của -de -dc-du các tùy chọn.


Thẻ xoay có thể được coi là "cần thiết để hiển thị hình ảnh".
Jeff

1
nên rõ ràng, nhưng chỉ hoạt động đối với các tệp JPEG
serv-inc

6

Tôi sẽ đi với ImageMagick cho hầu hết các hình ảnh. Điều này là do các triển khai thư viện khác nhau sẽ tạo ra các kết quả nén khác nhau, ImageMagick có thể thực hiện thống nhất nén.

Các loại phổ biến là dễ dàng vì hệ điều hành có thư viện để đọc và viết chúng. Vì thế:

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

Điều này sẽ đảm bảo rằng bạn có những hình ảnh được viết theo cùng một cách. Và sau đó bạn có thể thực hiện:

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

Đối với các định dạng RAW, tôi tin rằng cách duy nhất là làm như Phil nói, và do đó:

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

Và sau đó kiểm tra sẽ giống nhau. Bạn chỉ cần bắt chéo ngón tay rằng các định dạng hình ảnh kỳ lạ hơn có thể được tạo bằng một triển khai duy nhất (hoặc có định dạng tệp cứng nhắc).

Disclaimer : Điều này sẽ làm việc để so sánh tổng kiểm tra giữa họ. Nếu bạn lưu trữ tổng kiểm tra và sau đó chạy lại -stripsau khi cập nhật zlibhoặc libjpegbạn có thể kết thúc bằng tổng kiểm tra hoàn toàn khác nhau. Bạn cần xây dựng tổng kiểm tra cho mọi hình ảnh mỗi lần. Với những lo ngại về chất lượng hình ảnh, chỉ nên chạy cái này một lần .


Sửa tôi nếu tôi sai. Giả sử hai tệp đại diện cho cùng một hình ảnh nhưng được nén với hai thư viện khác nhau. Họ không 'giải nén' thành các pixel khác nhau vì jpg bị mất?
Jeff

1
Thường thì không, JPEG2000 có DCT được xác định rõ, nhưng đó chỉ là một phần của việc chuyển đổi hình ảnh. Mã hóa huffman cũng nên giống nhau. Nhưng đó là theo tiêu chuẩn, bạn thực sự có thể nén kết quả bằng thư viện nén. Trong các thư viện nén lý thuyết (ví dụ zlib) sẽ luôn tạo ra các kết quả khác nhau (ngay cả đối với cùng một thuật toán), nhưng hầu hết các thư viện jpeg đều tạo RNG theo cùng một cách để giữ mọi thứ lành mạnh (ví dụ libjpeg làm điều này).
hóa dầu

@Jeff Vấn đề khá tự nhiên vì mất mát có nghĩa là thông tin bị mất.
aventurin

Tất nhiên nếu bạn xác định chất lượng nén khác nhau (ví dụ -quality) tất cả các cược đã tắt.
hóa dầu

Có thể có một vấn đề với câu trả lời này. Các thẻ JFIF, bao gồm JFIFversion được chèn bởi tùy chọn hình ảnh -strip. Để xem điều này, hãy chạy exiftool -a -G1 -s <filename>trên các tệp được tạo bằng mogrify -stripexiftool -all=. Để xác nhận, hãy chạy exiftool -a -G1 -s <original-filename> | grep JFIF. Các tập lệnh trong tương lai bằng cách nào đó sẽ phải tính đến điều này nếu phiên bản JFIF khác.
Jeff

5

Với imagemagickgói và không chỉ cho JPEG, bạn có thể chỉ cần:

mogrify -strip *.jpg

Từ hướng dẫn :

-strip

tước hình ảnh của bất kỳ cấu hình, nhận xét hoặc các đoạn PNG này: bKGD, cHRM, EXIF, gAMA, iCCP, iTXt, sRGB, tEXt, zCCP, zTXt, ngày.

Nhiều thông tin hơn và hãy cẩn thận ở đây .

Lưu ý: Điều này tương tự như @grochmal nhưng đơn giản và đơn giản hơn nhiều.


Theo chủ đề đó, tốt hơn để đi với exiftool -all= *.jpgdải dữ liệu jpg.
Walt W

0

Một giải pháp có thể mà chỉ cần đến với tâm trí. Nó vượt qua vấn đề siêu dữ liệu. Nó giả định rằng các tệp kết thúc bằng chính hình ảnh, rằng tất cả các siêu dữ liệu nằm ở đầu tệp.

Hãy xem ổ đĩa sao lưu hiện tại là ổ đĩa vàng.

Đối với hình ảnh trên ổ đĩa vàng:

  1. Xóa mọi hình thu nhỏ được nhúng.
  2. Chunk tập tin bắt đầu ở cuối của họ bằng cách cắt đuôi, giả sử, M = 100k byte. Tham khảo phần đuôi đầu tiên (chứa phần cuối của tệp) là phần cuối.
  3. Tính toán md5sums của mỗi khối và lưu trữ chúng trong một danh sách chính được gọi là danh sách vàng.

Đối với hình ảnh trên các ổ đĩa cũ :

  1. Xóa mọi hình thu nhỏ được nhúng.
  2. Đuôi các M byte cuối cùng một tập tin.
  3. Tính md5sum của nó.
  4. LỚP U: Nếu tổng không có trong danh sách vàng, thì kết luận tệp là duy nhất cho ổ vàng. Sao chép nó vào ổ đĩa vàng. Tính md5sums của các phần còn lại và thêm chúng vào danh sách vàng. Chuyển sang tập tin tiếp theo.
  5. Mặt khác, cắt đuôi thứ hai đến byte M cuối cùng. Nhưng nếu các byte còn lại nhỏ hơn, giả sử, N = 50k, thì đừng bỏ qua các byte M. Thay vào đó xử lý phần còn lại là một đoạn quá khổ. N cần phải lớn hơn không gian lớn nhất được tiêu thụ bởi các vùng tiêu đề (loại trừ hình thu nhỏ).
  6. Tính toán md5sum của chunk.
  7. So sánh với danh sách vàng, và như vậy.
  8. LỚP D: Nếu các khoản tiền cho tất cả các khối nằm trong danh sách vàng, thì kết luận đó là một bản sao.
  9. LỚP P: Nếu các khoản tiền cho tất cả các khối nhưng cuối cùng nằm trong danh sách vàng, thì kết luận đó có thể là một bản sao.

Lớp P sẽ chứa các hình ảnh trên ổ đĩa vàng, nhưng có các exifdata khác nhau hoặc bị hỏng / thối dữ liệu trong các byte hàng đầu của hình ảnh.

Khi hoàn tất, kiểm tra LỚP P một cách tương tác, so sánh họ với bạn tình của họ trên ổ đĩa vàng.

Xem EDIT # 3 để OP.

Chuyển nhượng vào lớp U và D phải chính xác 100%.

Kích thước của Class P phụ thuộc vào kích thước khối M, vì các byte M + N đầu tiên của tệp gần như chắc chắn chứa một số dữ liệu hình ảnh (và tất cả siêu dữ liệu)


Tôi đã thực hiện một số định dạng bài đăng của bạn (vì vậy nó sử dụng bảng liệt kê đánh dấu thay vì các đoạn được nhồi nhét). Tuy nhiên, tôi thấy khá bí mật khi tìm hiểu ý của bạn về LỚP U, LỚP D, LỚP P ...
hóa học

gán từng tệp hình ảnh trên một ổ cứng cũ cho một trong ba lớp U (nique), D (uplicate) P (trùng lặp có thể sao chép)
Jeff

0

Nếu các ổ đĩa cũ chứa hầu hết các bản sao (bao gồm siêu dữ liệu) thì hãy sử dụng hai bước để tìm các bản sao như được định nghĩa trong OP (coi hai tệp là trùng lặp ngay cả khi chúng khác nhau về siêu dữ liệu):

  1. Sử dụng md5sums của các tệp chưa được xử lý nguyên vẹn để xác định tệp nào trên các ổ đĩa cũ là duy nhất (theo nghĩa thay thế này) cho ổ đĩa sao lưu hiện tại, gán chúng cho Class uU (unstripped-Unique) hoặc Class D (upilcate). LỚP D sẽ chính xác 100%. LỚP uU phải nhỏ (theo giả định ở trên) và chứa một sự pha trộn của các bản sao thực sự (trong OP Sense) và các bản sao thực sự.

  2. Làm việc với tập hợp nhỏ, có thể quản lý được, trong tập tin uU, sử dụng md5sums và các kỹ thuật tước khác nhau để thiết kế một phương pháp so sánh tệp hữu ích cho các mục đích được nêu trong OP.


0

Điều này hơi cũ, nhưng vâng, exiftool hoạt động rất tốt.

Hiển thị siêu dữ liệu của

exiftool photo.jpg

Hiển thị metedata cho tất cả các tệp * .jpg

Lưu ý: Phần mở rộng là trường hợp nhạy cảm .

exiftool -ext jpg

Tương tự như trên, nhưng bao gồm các thư mục phụ.

exiftool -r -ext jpg .

Xóa tất cả siêu dữ liệu

exiftool -all= -overwrite_original photo.jpg

Xóa tất cả siêu dữ liệu của tất cả các tệp * .jpg trong thư mục hiện tại

exiftool -all= -overwrite_original -ext jpg 

Tương tự như trên, nhưng bao gồm các thư mục phụ.

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

Xóa tất cả siêu dữ liệu GPS của các tệp * .jpg trong thư mục hiện tại

exiftool -gps:all= *.jpg
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.