画像ファイルからメタデータを取り除く方法


16

[ OPによる編集#1:この質問は、ExifToolフォーラムの複製スレッドで、 exiftool作成者/メンテナのPhil Harveyによってかなりよく回答されていることがわかります ]

[ OPによる編集#2ExifToolからのFAQExifToolは、すべてのメタデータを削除しようとしたときに、ファイルからメタデータを完全に削除すること保証されていません。「ライターの制限」を参照してください。]

現在のバックアップドライブにない写真を古いハードドライブで検索したいのですが。形式には、jpg、png、tifなどのほか、さまざまな未加工形式(カメラモデルやメーカーが異なる)が含まれます。

私は画像自体の一意性にのみ関心があります。たとえば、exifタグの値、特定のexifタグ自体の有無、埋め込まれたサムネイルなどの違いによるものではありません...

まったく同じ画像の異なるコピー間で破損やデータの破損が発生することはないと思いますが、サイズ変更や色の変更による違いだけでなく、それを検出したいと思います。

[ OPによる#3の編集:明確化:わずかな割合の誤検出が許容され(ファイルが一意でない場合は一意であると結論付けられます)、誤検出は非常に望ましくありません(ファイルが重複であると誤って結論付けられます)。 ]

私の計画は、すべてのメタデータを取り除いた後、md5sumsに基づいて一意性を識別することです。

メタデータを削除するにはどうすればよいですか?

ウィルexiftool -all= <filename>で十分?


1
JPEG圧縮ライブラリは異なる方法で圧縮するため、すべてのメタデータを削除しても、異なるJPEG実装で圧縮されているため、チェックサムが異なる同じ画像で終わる可能性があります。同じライブラリを使用してすべての画像を再保存する必要があります(品質が多少低下する可能性があります)。また、すべての画像をどのように見つける予定ですか? fileRAW画像形式の検出に失敗しfind、拡張機能でのみ機能します(自分が持っているものをより
詳しく

私が使用してきたfind $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"ところ<...>、他のサフィックスのAA束を意味します。
ジェフ

さまざまな圧縮ライブラリについての良い点。
ジェフ

1
BMP正規化画像convert image.jpg - | md5sum(ImageMagick)で適切なMD5合計が得られるかどうかを試すことができます。
アベンチュリン

1
phashと呼ばれる知覚的ハッシュアルゴリズムがあり、知覚的に類似した2つの画像の比較に役立ちます。ここで、stackoverflowにタグがあります。stackoverflow.com/ questions / tagged / phash 2つのファイルを比較するツールがあると便利ですが、すべての一致を見つけるためにO(n * n)。おそらくより良いワークフローがありますが、私は片手ではわかりません。しかし、phashはあなたを1つに導くかもしれないパンくずです。どうやらimagemagickはある種のphashサポートを持っている
2016

回答:


11

jheadJPEGファイルから非画像メタデータを削除する機能があります。マニュアルページは言う:

-dc

JPEGヘッダーからコメントフィールドを削除します。コメントはExifヘッダーの一部ではないことに注意してください。

-de

Exifヘッダーを完全に削除します。他のメタデータセクションをそのまま残します。

-di

IPTCセクションがある場合は削除します。他のメタデータセクションをそのまま残します。

-dx

XMPセクションがある場合は削除します。他のメタデータセクションをそのまま残します。

-du

Exifでもコメントでもない、または画像に寄与しないjpegのセクションを削除します(Photoshopが画像に残す可能性のあるデータなど)。

-purejpg

画像のレンダリングに不要なすべてのJPEGセクションを削除します。さまざまなアプリケーションが画像に残したメタデータを取り除きます。-de -dc-du オプションの組み合わせ。


回転タグは「画像のレンダリングに必要」
ジェフ

1
明確である必要がありますが、JPEGファイルでのみ機能します
serv-inc

6

ほとんどの画像にはImageMagickを使います。これは、ライブラリの実装が異なると圧縮結果も異なるため、ImageMagickは圧縮の統合を実行できるためです。

一般的な型は、OSがそれらを読み書きするためのライブラリーを持っているため、簡単です。そう:

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

これにより、同じ方法でイメージが書き込まれるようになります。そして、あなたは実行することができます:

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形式の場合、私はPhilが言うように行うことが唯一の方法であると信じています。

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

そして、チェックサムも同じです。よりエキゾチックな画像フォーマットを単一の実装で作成できる(または厳密なファイルフォーマットを持つ)ことを理解する必要があります。

免責事項:これは、それらの間のチェックサムを比較するために機能します。あなたがチェックサムを格納した場合は再実行-stripの更新後zlibまたはlibjpegあなたは完全に異なるチェックサムで終わることがあります。毎回すべてのイメージのチェックサムを作成する必要があります。画質に関する懸念がある場合、これを1 だけ実行するのが賢明です。


私が間違っていたら訂正してください。2つのファイルが同じ画像を表しているが、2つの異なるライブラリで圧縮されているとします。jpgは非可逆であるため、異なるピクセルに「圧縮解除」しませんか?
ジェフ

1
多くの場合、JPEG2000には明確に定義されたDCTがありませんが、それは画像の変換の一部にすぎません。ハフマンコーディングも同じでなければなりません。ただし、これは標準に関する限り、圧縮ライブラリを使用して結果を実際に圧縮できます。理論的には、圧縮ライブラリ(zlibなど)は常に(同じアルゴリズムでも)異なる結果を生成しますが、ほとんどのjpegライブラリは、RNGを同じ方法でシードして、正常に動作します(たとえば、libjpegがこれを行います)。
2016

@Jeff不可逆は情報が失われることを意味するため、問題は非常に自然です。
アベンチュリン

もちろん、異なる圧縮品質(例-quality:)を定義すると、すべてのベットが無効になります。
2016

この回答に問題がある可能性があります。JFIFversionを含むJFIFタグは、imagemagickオプションによって挿入されます-strip。これを確認exiftool -a -G1 -s <filename>するには、mogrify -stripおよびで作成したファイルを実行しますexiftool -all=。確認するには、を実行しexiftool -a -G1 -s <original-filename> | grep JFIFます。JFIFのバージョンが異なる場合、スクリプトの今後の実行では、どういうわけかこれを考慮する必要があります。
ジェフ

5

imagemagickパッケージとだけでなく、JPEGファイルのためにあなたができるだけで:

mogrify -strip *.jpg

マニュアルから:

-strip

プロファイル、コメント、またはこれらのPNGチャンクのイメージを取り除きます:bKGD、cHRM、EXIF、gAMA、iCCP、iTXt、sRGB、tEXt、zCCP、zTXt、日付。

はるかに多くの情報と警告はここにあります

注:これは@grochmalに似ていますが、はるかに簡単で単純です。


そのスレッドによると、exiftool -all= *.jpgjpgデータを削除する方が良いでしょう。
Walt W

0

頭に浮かんだ可能な解決策。メタデータの問題を回避します。すべてのメタデータがファイルの先頭にあるということは、ファイルが画像自体で終わることを前提としています。

現在のバックアップドライブをゴールドドライブと呼びます。

ゴールドドライブ上の画像の場合:

  1. 埋め込まれたサムネイルを削除します。
  2. M = 100kバイトのように、末尾からファイルをチャンクアップします。最初のテーリング(ファイルの最後を含む)をエンドチャンクと呼びます。
  3. 各チャンクのmd5sumを計算し、それらをゴールドリストと呼ばれるマスターリストに格納します。

古いドライブ上のイメージの場合

  1. 埋め込まれたサムネイルを削除します。
  2. ファイルの最後のMバイトをテールオフします。
  3. そのmd5sumを計算します。
  4. クラスU:合計がゴールドリストにない場合は、ファイルがゴールドドライブに固有であると結論付けます。ゴールドドライブにコピーします。残りのチャンクのmd5sumを計算し、それらをゴールドリストに追加します。次のファイルに進みます。
  5. それ以外の場合は、最後から2番目のMバイトをテールオフします。しかし、残りのバイトが、たとえばN = 50k未満の場合は、Mバイトを切り捨てないでください。代わりに、残りを少し特大のチャンクとして処理します。Nは、ヘッダー領域が消費する最大のスペースよりも大きくする必要があります(サムネイルは除外されます)。
  6. チャンクのmd5sumを計算します。
  7. ゴールドリストなどと比較してください。
  8. クラスD:すべてのチャンクの合計がゴールドリストにある場合、重複していると結論付けます。
  9. クラスP:最後を除くすべてのチャンクの合計がゴールドリストにある場合は、おそらく重複していると結論付けます。

クラスPには、ゴールドドライブにある画像が含まれますが、exifdataが異なるか、画像の先頭バイトに破損/データ腐敗があります。

完了したら、CLASS Pをインタラクティブに調べて、それらをゴールドドライブの仲間と比較します。

OPの編集#3を参照してください。

CLASS UおよびDへの割り当ては100%正確でなければなりません。

ファイルの最初のM + Nバイトにはほぼ確実に画像データ(およびすべてのメタデータ)が含まれているため、クラスPのサイズはチャンクサイズMに依存します。


私はあなたの投稿のいくつかのフォーマットを行いました(そのため、詰め込まれた段落ではなく、マークダウン列挙を使用します)。それでも私は...それはかなり難解あなたはCLASS U、CLASS D、CLASS Pによって何を意味するかアウトfigurを見つける
grochmal

古いハードドライブ上の各イメージファイルを、3つのクラスU(nique)、D(複製)P(おそらく複製)のいずれかに割り当てます
Jeff

0

古いドライブにほとんど重複(メタデータを含む)が含まれている場合、2つの手順を使用して、OPで定義されている一意を検索します(メタデータが異なる場合でも2つのファイルは重複と見なされます)。

  1. そのままのストリップされていないファイルのmd5sumsを使用して、古いドライブ上のどのファイルが現在のバックアップドライブに(この別の意味で)一意であるかを特定し、それらをCLASS uU(ストリップされていない一意)またはCLASS D(upilcate)に割り当てます。クラスDは100%正確です。CLASS uUは(上記の仮定により)小さく、真の重複(OPセンス内)と真の一意の組み合わせを含む必要があります。

  2. CLASS uU内の小さな、つまり管理可能なファイルのセットを操作し、md5sumsとさまざまなストリッピングテクニックを使用して、OPでレイアウトされた目的に役立つファイル比較の方法を設計します。


0

これは少し古いですが、はい、exiftoolは非常にうまく機能します。

のメタデータを表示

exiftool photo.jpg

すべての* .jpgファイルのメテダタを表示

注:拡張機能では大文字と小文字が区別されます。

exiftool -ext jpg

上記と同じですが、サブディレクトリを含みます。

exiftool -r -ext jpg .

すべてのメタデータを削除

exiftool -all= -overwrite_original photo.jpg

現在のディレクトリにあるすべての* .jpgファイルのすべてのメタデータを削除します

exiftool -all= -overwrite_original -ext jpg 

上記と同じですが、サブディレクトリを含みます。

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

現在のディレクトリにある* .jpgファイルのすべてのGPSメタデータを削除します

exiftool -gps:all= *.jpg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.