• Exif Exit

デジカメやスマホのカメラで撮影したデジタル写真の大半は、Exif(Exchangeable image file format)に対応している。Exifはもともと富士写真フイルムがJPEGのファイル形式の1つとして開発したもの。最初の仕様であるExif 1.0の制定は1995年10月だが、翌月に発表された一般向けデジタルカメラ「フジックスデジタルカードカメラ DS-220」は、ファイル形式にExifを採用していた。

その前機種である「フジックスDS-200F」は、フラッシュメモリを採用していたものの、撮影画像をファイルとして管理していなかった。メモリカードをPCから読むためには、「メモリーカードプロセッサDP-200F」というハードウェアが必要だった。

富士写真フィルムは1970年台からデジタルカメラの研究を開始しており、1988年にメモリーカード(独自仕様)を使うデジタルカメラを発表している。こうした開発の過程の時点で、銀塩カメラやフィルムビジネスの終息を予想していたのだと思われる。Exifは、当初、デジタルカメラからの紙焼きサービスや印刷のデータ形式として使われた。1997年には、コダックのFlashPix形式と相互変換できるExif2を発表している。当時、FlashPixは、IBMやIntel、Microsoftなどが支持しており、一時は業界標準になるかと思われたが、結果的には、Exifが生き残った。

JPEGには、JIFFと呼ばれるファイル形式もあったが、現在では、多くのJPEGファイルがExif形式を取る。1つには、Exif形式では、さまざまな撮影メタデータの記録が可能というメリットがある。

これは、「写真」の概念を大きく変えた。それまでの銀塩写真では、フィルムに日付データを移し込む程度のことしかできなかった。Exifでは、使用機材やメーカー、露出などの撮影情報やGPS情報なども記録が可能になり、写真自体が多数の情報を提供できるようになった。

このExif情報だが、主要なものは、Windowsの標準機能を使って取得できる。ただし、その利用には、PowerShellのコマンドを使う必要がある(写真01)。


$x=New-Object System.Drawing.Bitmap(".\Sample01.JPG")
$x.PropertyItems

ただし、Windows標準添付のWindows PowerShell(PowerShell.exe)を使う場合、上記のコマンドを実行する前に


add-type -AssemblyName system.Drawing

を実行してSystem.Drawingクラスを読み込んでおく必要がある。

  • 写真01: .NETのSystem.Drawing.Bitmapクラスを使いJPEGファイルを読み込むと、Windowsのファイル・プロパティシステムにアクセスができる。このとき、Idは、Windowsのプロパティタグだが、Exif由来のプロパティは、Exifと同じタグIDが使われる

Exifのタグは数値で表現されているが、それを解釈するデータベースが標準では搭載されていない。タグを表す数値とExifタグ名を対応させる列挙値が必要になる。これは、Exifの仕様書に記載があるが、PowerShellに読み込める形式のファイルを作らねばならない。筆者が作ったものをGitHubに置いた。ここからEXIFTags.ps1ファイルを入手して、PowerShellのドットソースで読み込むことで、EXIFTagsという列挙値(enum)が定義される。同様にPtype.ps1でTypeプロパティを人が読める形式にできる。また、PrintValue.ps1には、Typeに基づいて、Valueを変換する関数が定義されている。

前記のコマンドを実行したあと($xが定義されたあと)に、この3つのファイルをPowerShellにドットソースコマンドで読み込む。以下のコマンドを使えば、タグID値をExifのタグ名として表示できる(写真02)。


$x.PropertyItems | sort id |  select  @{Name="IdHex";Expression={$_.id.ToString("X4")}},@{Name="TagName"; Expression={[EXIFTags]$_.Id }} ,@{Name="Val"; Expression={[Ptype]$_.Type}},Value, @{Name="DisplayValue"; Expression={printvalue $_.Type $_.Value}} | ft
  • 写真02: タグID、Typeを列挙値にキャストすることで、人間に理解できるタグ名やデータタイプに変換できる。また、PrintValue.ps1で定義した関数で値をデータタイプに応じて変換することができる

PowerShellから直接Exifファイルのプロパティを扱えるため、例えば、ファイルをExifデータを元に振り分ける、あるいは、デジカメの機種ごとに撮影画像の数を数える、年間の撮影数を求めるといった処理が可能になる。

今回のタイトルネタは、タンジェリンドリームの1981年のアルバム「Exit」である。このアルバムには「Network 23」という曲が入っている。1987年の米国のドラマ「Max Headroom: 20 Minutes into the Future」に、登場するテレビ局の名前が「Network 23」である。特に言及はないが、何か関係があるのかも。なお、この番組は、1990年にNHKで「未来テレビ局 ネットワーク23」として放送された。