[UIKit] UIImagePickerController で返される .mediaMetadata を調べてみた

UIKit&AVFoundation

     
⌛️ 2 min.
iOS デバイスのカメラで写真を撮った時に取得できるデータを調べてみたので説明します。

(2020.Aug.29 追記)
UIImagePickerController だけではなく、AVCapturePhotoOutput.capturePhoto で返される情報が保持する metadata についても、同様の情報が返されることを確認しました

UIImagePickerController で取得できる情報 / 調べたいこと

JPEG ファイルには、Exif データが付与されている時があり、撮影日時や機材の情報が取得できることがあります。

iPhone 等のデバイスで写真を撮った時には、どのようなメタデータを取得できるのでしょうか?

具体的には、UIImagePickerController を使って、カメラで撮影した時に Info として渡されるデータは、何が含まれているのでしょうか?

# まだ JPEG 等にもなっていないので、JPEG ファイルに保存してから、Exif データをチェックするのは、少し違う気がします。

ということで、UIImagePickerController で渡されてくる メタデータを調べてみました。




調べる対象

以下の環境で調べてます。

  • Xcode12 beta3
  • iOS 13.5/ iPad Pro 9.7
  • func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])で渡されてくるinfo[.mediaMetadata]

調べた結果

大きく以下に分かれます。コールバックに渡される info 自体が NSDictionary なのですが、以下の値をキーにさらに NSDictionary が取得でき、その中に情報が保存されています。

  • Exif
  • TIFF
  • MakerApple
  • その他

以下では、
  キー値 (保存されていたタイプ) : 取得できた値
    意味
として記載してます。

Exif情報

以下のような情報が保持されていました。(数回しかテストしていないので、機種・状況によって異なるデータになっているかもしれません)

# カメラに詳しくないので、キー値を日本語化してますが、意味わかってません。

DateTimeOriginal (__NSCFString) 値: 2020:08:04 13:14:47
撮影日時
ExposureBiasValue (__NSCFNumber) 値: 0
露出
FocalLenIn35mmFilm (__NSCFNumber) 値: 29
35mm換算焦点距離
BrightnessValue (__NSCFNumber) 値: 2.761715198143849
明るさ
SensingMethod (__NSCFNumber) 値: 2
不明
LensMake (NSTaggedPointerString) 値: Apple
レンズ製造者
FNumber (__NSCFNumber) 値: 2.2
F値
FocalLength (__NSCFNumber) 値: 4.15
焦点距離
ShutterSpeedValue (__NSCFNumber) 値: 4.906991587796148
シャッタースピード
SceneType (__NSCFNumber) 値: 1
シーンタイプ(?)
ApertureValue (__NSCFNumber) 値: 2.27500704749987
絞り
SubjectArea (__NSArrayI) 値: (2015, 1511, 2217, 1330)
不明
ColorSpace (__NSCFNumber) 値: 65535
色空間
LensSpecification (__NSArrayI) 値: (“4.15”, “4.15”, “2.2”, “2.2”)
不明
PixelYDimension (__NSCFNumber) 値: 3024
Y方向サイズ
WhiteBalance (__NSCFNumber) 値: 0
ホワイトバランス
DateTimeDigitized (__NSCFString) 値: 2020:08:04 13:14:47
デジタル化された日時
OffsetTimeOriginal (NSTaggedPointerString) 値: +09:00
撮影時の時差
ExposureMode (__NSCFNumber) 値: 0
露出モード
ISOSpeedRatings (__NSSingleObjectArrayI) 値: (80)
ISO
OffsetTimeDigitized (NSTaggedPointerString) 値: +09:00
デジタル化された日時の時差
ExifVersion (NSTaggedPointerString) 値: 0232
Exifバージョン
PixelXDimension (__NSCFNumber) 値: 4032
X方向サイズ
OffsetTime (NSTaggedPointerString) 値: +09:00
時差
ExposureTime (__NSCFNumber) 値: 0.03333333333333333
Flash (__NSCFNumber) 値: 24
フラッシュ
SubsecTimeDigitized (NSTaggedPointerString) 値: 825
不明
LensModel (__NSCFString) 値: iPad Pro back camera 4.15mm f/2.2
レンズモデル
SubsecTimeOriginal (NSTaggedPointerString) 値: 825
不明
ExposureProgram (__NSCFNumber) 値: 2
露出プログラム
MeteringMode (__NSCFNumber) 値: 5
測定モード

ExifVersion が 232 となっていますので、Exif の規格を調べると上記項目の詳細が分かると思います。(が、自分は日付にしか興味がないので調べてません)

TIFF

Exif と同様に TIFF の情報も取得することができました。

ResolutionUnit (__NSCFNumber) 値: 2
解像度の距離単位(DPI の I)
Software (NSTaggedPointerString) 値: 13.5.1
ソフトウェアバージョン
DateTime (__NSCFString) 値: 2020:08:04 13:14:47
日付
XResolution (__NSCFNumber) 値: 72
X方向解像度
Model (NSTaggedPointerString) 値: iPad Pro
モデル
YResolution (__NSCFNumber) 値: 72
Y方向解像度
Make (NSTaggedPointerString) 値: Apple
製造者

こちらも、詳細は、TIFF の仕様を調べると良いかもしれません。




MakerApple

一応、取得できたデータを列挙していますが、さっぱり意味がわかりません。

31 (__NSCFNumber) 値: 0
1 (__NSCFNumber) 値: 11
2 (__NSCFData) 値: {length = 512, bytes = 0x5e00e800 2a01fa00 bc000301 48015900 … 61015401 74013e01 }
9 (__NSCFNumber) 値: 4371
32 (__NSCFString) 値: D38ADD84-D22E-43CF-A462-3A405A261C1F
3 (__NSDictionaryI) 値: {epoch = 0; flags = 1; timescale = 1000000000; value = 2013189778028625;}
37 (__NSCFNumber) 値: 0
4 (__NSCFNumber) 値: 1
43 (__NSCFString) 値: 556A9D0F-97AE-4B6D-B83B-603611661343
5 (__NSCFNumber) 値: 156
38 (__NSCFNumber) 値: 0
23 (__NSCFNumber) 値: 0
6 (__NSCFNumber) 値: 149
7 (__NSCFNumber) 値: 1
39 (__NSCFNumber) 値: 0
8 (__NSArrayI) 値: (“-0.740957498550415”, “-0.004542297217994928”, “-0.6542644500732422”)
14 (__NSCFNumber) 値: 0
20 (__NSCFNumber) 値: 4
25 (__NSCFNumber) 値: 0

どこかに、説明ドキュメントはあるのでしょうか??

その他

Infoからキーを使って直接に値を取得できるものがいくつかありました。

DPIWidth (__NSCFNumber) 値: 72
横方向DPI
DPIHeight (__NSCFNumber) 値: 72
縦方向DPI
Orientation (__NSCFNumber) 値: 1
向き
kCGImageDestinationICCProfile (__NSCFData) 値: {length = 548, bytes = 0x00000224 6170706c 04000000 6d6e7472 … 000003dc 0000c06e }
ICCProfileに関係してそうです




まとめ

.mediaMetadata のデータを列挙してみました。撮影した写真から、画像データ以外を取得したくなった時に、上記の項目がスタート地点になりそうです。

(2020.Aug.29 追記)
AVCapturePhotoOutput.capturePhoto で返される AVCapturePhoto の保持する metadata も同様の情報を持っていました。

説明は以上です。




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です