📸

カメラメーカーごとの Exif 情報の違いに困った話

2023/08/28に公開

ラブグラフエンジニアの水瀬ひろです!

個人開発中にぶつかった、 メーカーによるExif 情報の違い について書いておこうと思います。
ラブグラフは写真の会社ですしね。

調べた機種

# RICOH GR II
# RICOH GRⅢx
# SONY NEX-7
# SONY ILCE-7M3
# SONY ILCE-7RM3
# SONY ILCE-7M4
# Canon EOS Kiss X7
# Canon EOS 5D Mark III
# Canon EOS 5D Mark IV
# Canon EOS R6
# FUJIFILM X100S
# FUJIFILM X100V
# Apple iPhone 11
# ASUS_X00QD

目次

35mm換算の焦点距離情報があったりなかったりする
F値の格納方法が違う
まとめ

35mm換算の焦点距離情報があったりなかったりする

まずこれにハマりました。
Canon・FUJIFILM の Exif には、35mm換算の焦点距離情報が保存されていませんでした。
フルサイズ・APS-Cなどのセンサーサイズによらず、です。

今回作っているアプリで

  • レンズ自体の焦点距離
  • 35mm換算の焦点距離

どちらも表示したかったのですが、カメラのセンサーサイズを Exif から取得できそうになかったので断念しました。

ちなみに

もし35mm換算の焦点距離を表示しようと思うと以下のような処理が必要そうです。

  1. カメラ名からセンサーサイズを推定(カメラすべての名前×センサーサイズのリストを用意)
  2. Exif から取得した焦点距離に対して 35mm換算 を実行→表示

簡易的な35mm換算方法

フルサイズ: ×1
Canon APS-C: ×1.6
その他 APS-C: ×1.5
マイクロフォーサーズ: ×2

F値の格納方法が違う

下のようにメーカーによって分数で入っていたり、整数で入っていたりします。
利用する場合はこの仕様に対応する実装をしなければなりません。

7/5
4
14/5
5/2
2

今回は Flutter で作っていたので以下のように実装し、
分数・整数どちらが入っていても対応できるようにしました。

(ちなみに焦点距離も分数や整数で保存されているので、同じような処理が必要)

// F値が分数または数値で登録されているので変換
// 分数で入っていることが多いのでそれを前提として処理

String fNumberStrFromExif = "";
// /で分割して配列に
final List<String> rawFNumberStrArray = exifData["EXIF FNumber"].toString().split("/");

// Exif にF値がない写真を考慮
if (rawFNumberStrArray[0] == "null") return "";

if (rawFNumberStrArray.length == 1) { 
  fNumberStrFromExif = rawFNumberStrArray[0];
} else {
  // 分数を小数に直す
  final double calcFNumber = int.parse(rawFNumberStrArray[0]) / int.parse(rawFNumberStrArray[1]);
  // 小数点第一位までの文字列に変換
  fNumberStrFromExif = calcFNumber.toStringAsFixed(1);
}

return fNumberStrFromExif;

まとめ

お読みいただきありがとうございました!
今回は Exif を例に規格が統一されていないとつらい、というお話でした。
エンジニア兼カメラマンとして、写真と実装に関する記事が書けてよかったです。

Exif には他にもたくさんの項目が保存されているので、活用していきたいですね。
次回は Exif に保存されている位置情報についての小ネタがあるのでそれを書こうと思います!

ラブグラフのエンジニアブログ

Discussion