Exifをパースした話
JPEGにはExifと呼ばれるメタデータがはいっていて、F値やらジオタグやらなんやらが入っている(ことがある)のだが、Windowsphoneでそれをいい感じにパースして、さらにジオタグを足してくれるライブラリが見当たらなかったので、自分で適当に書いていた。
基本的なフォーマットはぐぐれば割と出てくる(のだが、断片的な解説だけだったりして、複数の情報をながめながら感覚で作っていくしかない)。当然、公式の規格書[PDF]を読む根性など持ち合わせていない。
そんなかんじで自分のプロジェクトで使っていたのだが、最近になってバグがぽろぽろ見つかったのでテストをがんがん増やして直したりしていた。つらかった。はまったことをメモしておく。
- App1 marker内はbig endianかlittle endianかがベンダによって異なる。すごい。にも関わらずその外側はだいたいbig固定。意味が不明。
- App1 marker内だけ見たいので固定アドレスを見に行きたくなるが、なぜかたまにApp0 markerとかいうのを持ってるやつがいる。最新の規格書には記載がないようだが… いずれにせよフォーマットは同じなのでしっかり無視してあげればよさそう。
- だいたいの値がUnsignedなのでまったく気付かなかったのだが、signedな負の数もたまに入ってくる。露出補正値とか。ちなみに2の補数で入っているっぽい。ぐぐってもわからんかったので適当にやってたらばぐって苦労したが、いま仕様書みたらちゃんと書いてあった。最初から読めばよかった。
- 基本的に小数(実数)は分数の形で入っているのだが、カメラメーカー以外はシャッター時間の入れ方が雑。QX100とかはちゃんと分子に1, 分母に100とかって入れてくるのだが、Lumia 920なんかはすごくて、40003/1000000 みたいな値を入れてくる。おまえその3/1000000秒絶対嘘だろ。表示に気を遣う必要がある。だるい。
- なんかフォーマットたくさんありそうだしあらゆる画像にちゃんと対応するの無理感がある
- NFCは単純な構造で楽だった
- Windowsのエクスプローラは1クリックでメタデータをいじれるようになってしまっているので危険。当然だが1カ所でもいじるとメタデータすべて再構成されるのでバイトオーダも変わるしただひたすらつらい
- 0th IFDにGPS IFDへのOffsetが書いてあるにもかかわらずGPS IFDの中身が空とかそういう画像もあった。規格上問題ないのかもしれないがつらい。
- つらい
以上