Exif って意外にメンドイ
※ そろそろこの「メンドイ」「面倒くさい」シリーズのタイトルも飽きてきたな。
singapore で Web アルバム作ってますよというか singapore 配下のディレクトリに写真のデータ放り込んでおく1と楽でいいなという話は以前書いた通りなんだけども、メタデータ(metadata.ja.csv)の作成がやっぱり面倒くさい。
以前は写真を放り込んだディレクトリで emacs を開いて M-x shell から ls して写真の一覧を作成して、それでチマチマコピペしながら必要なフィールド数の分カンマを打ったり、適切なフィールドにデータを入力したりしてたんだけど、案の定激しく面倒くさい。
ということでコッソリと、指定ディレクトリ内の JPEG ファイルの Exif データを読み取って、設定ファイルに従って singapore 用の csv ファイルを作成するツールを作ってみていた。動くようになってからおぉ割と便利だこれは、と気づくまで時間は掛からなかったんだけど、今回は作る段階で以下の点にハマった。
exif を読み取る ruby 用のライブラリがあんまり充実してない
どうせなら露出補正の値がほしいと思った2んだけど、なんかあんまりみんなそこまで踏み込んでくれない。個人的にはコマンドラインでも使いやすく、情報量の豊富な exiv2 が気に入ってるんだけど、libexiv2-ruby は FreeBSD 上でうまく gem install できなかった。
ぼくちんバインディングの作成なんてできないので諦めて今回は exiv2 の実行バイナリを叩くことにした。うーんかっこ悪いけどしゃあないか。サーバは速くなったことだし、いつも動かすものではないので負荷も気にしないこととする。
カメラによって入ってるタグが違う
なんか独自タグがあるぞ…。どこの業界もこういう標準フォーマットってある程度までしか守られないんだよな。まったくもう。
あと似たような意味の値が2つあることに気がついた。
タグ | 意味 | タグ | 意味 |
ExposureTime | 露光時間 | FNumber | F値 |
ShutterSpeedValue | シャッタスピード | ApertureValue | 絞り値 |
どうもそれぞれ下の値の方が正確っぽい。上の値は代表的な値に丸められてしまっているらしい。
が。手元の Nikon のカメラの場合は ShutterSpeedValue は存在しない代わりに ExposureTime の方に中途半端な値が入っている。これはたぶん他の機種の ShutterSpeedValue に相当してるんじゃないかろうか? うーむ、ということは下の値を優先的に取得するようにして、なかったら上の値を取る、っつー動きにしないといかんのか。対応した。
sort オプションの存在に気づく
なんつーか、今までお前は何をしていたんだという感じだけど、singapore.ini にギャラリー(フォルダに相当)のソート、写真のソートについての設定項目を発見! そうか、なんか今までファイル名の順番でしか写真が一覧できなくて不便だなと思っていた(複数台のカメラがある場合にちゃんと時系列に並んでくれない)んだけど、ちゃんと設定項目あるんだね。
あ、そうかこれは date フィールドの値を読み取ってソートするオプションなのか。こんなの手で入力するなんて狂気の沙汰だからファイル名のソートに設定していたのかもしんない。ということはツールで自動作成するようにした今はちゃんと時系列表示にできるではないか! 設定変更、リロード! おぉ! ちゃんと時系列に出てくるじゃん!
さて、metadata.ja.csv の方にもうちょっと詳細なデータを記入…しようと思ったらこっちはファイル名の順番のままだから singapore 上の順番と完全に食い違っちゃって編集しにくい。
うぇ。ということは metadata.ja.csv を作成する段階でも日時順とかでソートする機能があった方がいいんだな…。うーん。できなくはないんだが、ちょっと面倒くさくなってきたな。また今度考えよう。
できた。というか実はソートの機能は一度付けたけど singapore 上で効果がなかったので殺しておいたのだった。ちゃんと使えるように optparse とかあれこれ調整しておしまい。ついでに reverse sort もできるようにしておいた。