2008-09-12 13 views
61

私はjpegの写真を通過する小さなプログラムをC#で作成したいと思います。例えば、日付を記入した慣習を使用してください。 )。C#を使用してファイルからEXIFデータを取得する方法

誰も、日付と時間、露出などのEXIFデータをプログラマチックに取得する比較的簡単な方法を知っていますか? ありがとう! JPEG画像からEXIFデータを取得

+0

イメージメタデータに対するBCLのビルトインサポートは非​​常に限定されています。私は2002年からExifなどのメタデータを使って作業しており、シンプルで強力な[.NET用のデータを抽出するライブラリ](https://github.com/drewnoakes/metadata-extractor-dotnet)を持っています。 –

答えて

3

が含ま:EXIFデータの先頭に言及JPEGマーカーに探している

  1. を,.例えば通常oxFFE1は、EXIFデータをエンコードする際に挿入されるマーカーです。これは、EXIFデータが入るAPPlicationセグメントです。
  2. 0xFFE1から0xFFE2までのすべてのデータを解析します。このデータは、JPEGエンコードされたファイルのバイトストリームです。これらのバイトの
  3. ASCII換算は
5

ImageクラスはPropertyItemsとPropertyIdList特性を有する...画像の日付、カメラモデル名、露出などに関連する様々な情報が含まれています。あなたはそれらを使うことができます。

+0

それは、読み取り専用なので、私は新しい画像に追加することはできません... – TigrouMeow

+3

新しい画像にImage.SetPropertyItem(PropertyItem)関数を使用します。 –

9

これをチェックアウトするmetadata extractor これはJavaで書かれていますが、C#にも移植されています。 私は日付とモデルのタグに基づいて私のjpegファイルの名前を変更するための小さなユーティリティを記述するために、Javaのバージョンを使用しています。非常に使いやすい。


EDITメタデータ抽出はあまりに.NETをサポートしています。これは、画像や動画からメタデータにアクセスするための非常に高速でシンプルなライブラリです。

それは完全にそれがのEXIFをサポートし、だけでなく、IPTC、XMPおよびJPEG、PNG、GIF、PNG、ICO、WEBP、PSD、などのファイルタイプからメタデータを他の多くの種類の...

var directories = ImageMetadataReader.ReadMetadata(imagePath); 

// print out all metadata 
foreach (var directory in directories) 
foreach (var tag in directory.Tags) 
    Console.WriteLine($"{directory.Name} - {tag.Name} = {tag.Description}"); 

// access the date time 
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault(); 
var dateTime = subIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTime); 

NuGetcode's on GitHubで利用可能です。

9

ここに別のsimilar SO questionへのリンクがあります。これは、.netの"Reading, writing and photo metadata"のこの良い記事を指し示す答えを持っています。

+0

[ExifLib - A Fast Exif Data Extractor for .NET 2.0 +]を指す**非常に良い回答** [ここにあります](https://stackoverflow.com/q/10494796/2803565)(https ://www.codeproject.com/Articles/36342/ExifLib-A-Fast-Exif-Data-Extractor-for-NET-2-0) –

40

提案したように、サードパーティのライブラリを使用することも、手作業で行うこともできますが、これはあまり効果的ではありませんが、最も簡単で柔軟な方法はおそらく.NETの組み込み機能を使用することです。より参照してください:

  • How to: Read Image Metadata

  • 私は.NETが解釈しようとしたりしないので、 "それは最も柔軟だ" と言いますどのような方法でもデータを統合します。各EXIFについて、基本的にバイト配列を取得します。これは実際にどれくらいのコントロールが必要かによって、良いか悪いかが分かります。

    また、プロパティリストは実際にはEXIF値に直接対応していないことを指摘しておきます。 EXIF自体は複数のテーブルに重複するIDで格納されますが、.NETはすべてを1つのリストに置き、いくつかのアイテムのIDを再定義します。しかし、正確なEXIF IDについて気にしない限り、.NETマッピングでうまくいくはずです。

    +8

    Bitmap.PropertyItemsにアクセスするには、ファイル全体をメモリに読み込む必要があります。 Bitmapを作成してPropertyItemsにアクセスして何もしない場合は、XPerfを使用してアプリがイメージファイルにアクセスし、そのすべてをメモリに読み込むことができます。私のコンピュータの場合、3.4Mbのファイルは、PropertyItems経由でEXIFを取得するために、> 700ms以上のIOを必要とします:(。 – Tristan

    +4

    これと比較して、PicasaのPhotoViewerはタッチする各ファイルからわずか20〜30kを読み込みます。 – Tristan

    +0

    @Tristan:有用な情報ですが、イメージ自体も必要とせずにイメージメタデータにアクセスする頻度はどれくらいですか?(このデータは、XPerfを使用してPhotoViewerのスタートアップをプロファイリングして収集したものです。私は確かにいくつかのケースがあると確信していますが、大部分のケースでは、画像を表示する(またはそれ以外の方法でデータを扱う)と同時にメタデータがあると思います。 – jrista

    6

    TagLib#は、F-Spotなどのアプリケーションで使用されます。 Exif以外にも、画像、オーディオ、ビデオ用のメタデータフォーマットが豊富に読み込まれます。

    私もExifUtils APIが好きですが、バギーで積極的に開発されていません。

    3

    コマンドラインツールExifTool by Phil Harveyは、数多くの独自のRAW形式を含む数十の画像形式で動作し、EXIF、GPS、IPTC、XMP、JFIFなどのさまざまなメタデータ形式を操作できます。

    非常に使いやすく、軽量で印象的なアプリケーションです。

    +0

    ExifToolは素晴らしいlib/toolですが、Perlで書かれているので、C#からそれを使用すると外部プロセスを起動する必要があります。 –

    関連する問題