Flickr APIの研究(Exifデータ)

Flickrにアップロードされた写真をうまくデータベース化できないか、チャレンジは続いていますが、その過程で得たFlickr APIの使い方などを、備忘録的に書いています。今回は、写真のExifデータを取得するAPIです。

Flickr_api_explorer_01

Exifデータとは、撮影時にカメラによって記録されるさまざまな情報です。代表的なものは、撮影日時、カメラやレンズのモデル、F値、シャッター速度、ISO感度、焦点距離などで、通常は数十に及ぶ情報が記録されています。これらをデータベースに活用しない手はありません。

Exifデータを取得するのも簡単で、ここで書いたように、引数に写真のIDなどを渡してAPIをコールするだけです。結果は、かなりの量の情報で返されます。

さて、今までは、どのような情報が返されるかプログラムを書いて調査していたのですが、FlickrではAPI Explorerという便利な仕組みがあることに今さら気付きました。これを使うと、写真のIDなどを指定するだけで、FlickrのWebサイト上でAPIの動きを検証できます。

さっそくやってみました。

Flickr_api_explorer_02

「Call Method」ボタンを押すと、下にテキストボックスが表れ、取得結果が表示されます。

Flickr_api_explorer_03

ここからコピー&ペーストすれば、取得内容を保存し、研究することができます。主立った項目をピックアップしてみましょう。

基本的に、すべてのExif情報は、exif要素として返ります。情報の種類を区別するには、tag属性を判別します。exif要素内から、raw要素の内容を取り出すというのが基本スタイルになります。

撮影日時は、こんな感じで返ります。日付の区切りもコロンなので、要注意です。

<exif tagspace="ExifIFD" tagspaceid="0" tag="DateTimeOriginal" label="Date and Time (Original)">
  <raw>2010:07:18 15:58:56</raw>
</exif>

カメラのモデルは、こんな感じで返ります。メーカー名も知りたければ、Makeをtag属性に持つexif要素を探します。メーカー名が、すでにModelに含まれている場合もあり、要注意です。

<exif tagspace="IFD0" tagspaceid="0" tag="Model" label="Model">
  <raw>Canon EOS 40D</raw>
</exif>

レンズのモデルは、こんな感じで返ります。LensIDとLensModelの2種類で返りますが、tagspace要素で見ればLensModelの方はCanonであり、ベンダー依存のようです。Compositeの方を持ってきた方がよいようです。

<exif tagspace="Composite" tagspaceid="0" tag="LensID" label="LensID">
  <raw>Canon EF100mm f/2.8L Macro IS USM</raw>
</exif>

<exif tagspace="Canon" tagspaceid="0" tag="LensModel" label="Lens Model">
  <raw>EF100mm f/2.8L Macro IS USM</raw>
</exif>

焦点距離、F値、ISO感度などは、こんな感じで返ります。

<exif tagspace="ExifIFD" tagspaceid="0" tag="FocalLength" label="Focal Length">
  <raw>100.0 mm</raw>
  <clean>100 mm</clean>
</exif>

<exif tagspace="ExifIFD" tagspaceid="0" tag="FNumber" label="Aperture">
  <raw>2.8</raw>
  <clean>f/2.8</clean>
</exif>

<exif tagspace="ExifIFD" tagspaceid="0" tag="ISO" label="ISO Speed">
  <raw>640</raw>
</exif>

FocalLengthとFNumberを見てもらえるとわかるのですが、clean要素をさらに含む形になっています。これは、表示に便利に装飾した形、とコメントされています。データベースに記録する際には、raw要素の値を使う方がよいでしょう。

実際には、カメラのモデルなどを変えて撮った写真で、どのような形式で返るかを検証しながら、プログラムで対応していった方がよいでしょう。

コメント