質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
exif

Exifは、デジタルカメラで撮影した画像データに、撮影時の状況などさまざまな情報(メタデータ)を添付して保存する画像ファイル形式の規格です。この付加情報により、データ管理や機器同士のデータ交換、最適な設定の出力などを行うことができます。

GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

9212閲覧

jpgファイルからはGPSやEXIF情報を読めるが、HEIC(HEIF)からは読めない。

data7600

総合スコア18

exif

Exifは、デジタルカメラで撮影した画像データに、撮影時の状況などさまざまな情報(メタデータ)を添付して保存する画像ファイル形式の規格です。この付加情報により、データ管理や機器同士のデータ交換、最適な設定の出力などを行うことができます。

GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/05/21 16:15

iPhoneで撮影した写真からGPSやEXIF情報を取り出して利用したいが、HEIC形式のものからは取り出せず困っています。
同一の写真でもオリジナルのHEIC形式のものからは読み取れなかったものが、他のアプリでjpg形式に変換されたものからは読み取れたので、GPSやEXIF情報自体がないわけでは無いようです。

以下のようなコードで読み込んでいます。

swift

1import UIKit 2import Photos 3class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 4 5 //選んだ写真を表示するびゅー 6 @IBOutlet weak var imageView: UIImageView! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view. 11 } 12 13 //アルバムを呼び出すボタン 14 @IBAction func toAlbumBtn(_ sender: Any) { 15 let picker = UIImagePickerController() //アルバムを開く処理を呼び出す 16 picker.sourceType = .photoLibrary 17 picker.delegate = self 18 present(picker, animated: true) 19 self.present(picker, animated: true, completion: nil) 20 } 21 22 // 画像が選択された時に呼ばれる 23 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 24 //imageViewにカメラロールから選んだ画像をビューに表示する 25 if let selectedImage = info[.originalImage] as? UIImage { 26 imageView.image = selectedImage 27 } 28 //infoは読み込んだ画像についてのURL等の情報 29 print("いんふぉ",info) 30 //画像のURLを取り出す。 31 let url = info[.imageURL] as! URL 32 print("いんふぉゆーあーるえる",url) 33 34 //画像のURLを指定してCIImageで取り込んでプロパティを表示。exif,tiffを含む 35 let inputCIImage = CIImage(contentsOf: url)! 36 let CIImageProperties = inputCIImage.properties 37 print("しーあいいめーじぷろぱてぃ",CIImageProperties) 38 39 self.dismiss(animated: true) //画像をImageViewに表示したらアルバムを閉じる 40 } 41 42 // 画像選択がキャンセルされた時に呼ばれる 43 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 44 self.dismiss(animated: true, completion: nil) 45 } 46}

これで、HEIC形式の写真を読み込むと、

しーあいいめーじぷろぱてぃ ["PixelHeight": 3024, "{TIFF}": { Orientation = 1; ResolutionUnit = 2; XResolution = 72; YResolution = 72; }, "{Exif}": { ColorSpace = 1; ComponentsConfiguration = ( 1, 2, 3, 0 ); ExifVersion = ( 2, 2, 1 ); FlashPixVersion = ( 1, 0 ); PixelXDimension = 4032; PixelYDimension = 3024; SceneCaptureType = 0; }, "Depth": 8, "ColorModel": RGB, "DPIHeight": 72, "DPIWidth": 72, "Orientation": 1, "PixelWidth": 4032, "ProfileName": Display P3]

となるが、
jpg形式で保存し直した写真を読み込むと、

しーあいいめーじぷろぱてぃ ["PixelHeight": 3024, "{GPS}": { Altitude = "95.04964832436906"; AltitudeRef = 0; DestBearing = "63.17312620115311"; DestBearingRef = M; HPositioningError = 10; ImgDirection = "63.17312620115311"; ImgDirectionRef = M; Latitude = "34.884195"; LatitudeRef = N; Longitude = "134.5251"; LongitudeRef = E; Speed = 0; SpeedRef = K; }, "{MakerApple}": { 1 = 11; 12 = ( "21.16406", "24.17578" ); 13 = 14; 14 = 4; 15 = 2; 16 = 1; 2 = {length = 512, bytes = 0x84006900 9200af00 d7000e01 0901f500 ... 7e004800 52007100 }; 20 = 5; 23 = 8192; 25 = 0; 26 = q825s; 3 = { epoch = 0; flags = 1; timescale = 1000000000; value = 474567397269583; }; 31 = 0; 32 = "E0E64200-8A54-488A-9F0E-148460FE6E9E"; 33 = 0; 35 = ( 33, 536870991 ); 37 = 0; 38 = 0; 39 = 0; 4 = 1; 43 = "CCD9F1B7-6227-4326-8B6C-89B9920EE052"; 5 = 181; 6 = 184; 7 = 1; 8 = ( "-0.5236124", "-0.01103583", "-0.8577724" ); }, "DPIWidth": 72, "{TIFF}": { DateTime = "2020:05:16 15:38:12"; Make = Apple; Model = "iPhone X"; Orientation = 1; ResolutionUnit = 2; Software = "13.1.3"; TileLength = 512; TileWidth = 512; XResolution = 72; YResolution = 72; }, "Orientation": 1, "DPIHeight": 72, "PixelWidth": 4032, "Depth": 8, "{Exif}": { ApertureValue = "1.69599381283836"; BrightnessValue = "1.886196921169542"; ColorSpace = 65535; ComponentsConfiguration = ( 1, 2, 3, 0 ); DateTimeDigitized = "2020:05:16 15:38:12"; DateTimeOriginal = "2020:05:16 15:38:12"; DigitalZoomRatio = "1.8"; ExifVersion = ( 2, 3, 1 ); ExposureBiasValue = 0; ExposureMode = 0; ExposureProgram = 2; ExposureTime = "0.06666666666666667"; FNumber = "1.8"; Flash = 24; FlashPixVersion = ( 1, 0 ); FocalLenIn35mmFilm = 51; FocalLength = 4; ISOSpeedRatings = ( 64 ); LensMake = Apple; LensModel = "iPhone X back dual camera 4mm f/1.8"; LensSpecification = ( 4, 6, "1.8", "2.4" ); MeteringMode = 5; OffsetTime = "+09:00"; OffsetTimeDigitized = "+09:00"; OffsetTimeOriginal = "+09:00"; PixelXDimension = 4032; PixelYDimension = 3024; SceneCaptureType = 0; SceneType = 1; SensingMethod = 2; ShutterSpeedValue = "3.907208021698036"; SubjectArea = ( 2011, 1505, 2212, 1327 ); SubsecTimeDigitized = 257; SubsecTimeOriginal = 257; WhiteBalance = 0; }, "{JFIF}": { DensityUnit = 0; JFIFVersion = ( 1, 0, 1 ); XDensity = 72; YDensity = 72; }, "ColorModel": RGB]

と、なります。

HEIF形式の写真から直接、または、アプリ内でjpg形式に変換して、GPSやEXIF情報を取り出すにはどうすればよいか教えていただけますでしょうか。
宜しくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以前同じようにExifの情報を取り出したくて調べたことがあるのでよければ参考にしてください。

質問のコードを見ると UIImage から CIImage を生成し、CIImage.properties から
各情報を取り出しているようですが、この方法だと .heic 形式の画像の情報は取れなかったと思います。

いろいろ調べたところ、カメラロールから選んだ画像から PHAsset を取り出し、
そこから CIImage を生成して、CIImage.properties を参照すれば .heic 形式の画像でも上手く情報を取り出すことができました。

PHAsset を取り出すためにはライブラリへのアクセスが必要なので、
info.plist に Privacy - Photo Library Usage Description の記載がされていない場合は忘れずに行ってください。

Swift

1func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { 2 if let asset = info[.phAsset] as? PHAsset { 3 asset.requestContentEditingInput(with: nil) { contentEditingInput, _ in 4 if let url = contentEditingInput.fullSizeImageURL, 5 let ciimage = CIImage(contentsOf: url), 6 let exif = ciimage.properties[kCGImagePropertyExifDictionary as String] as? [String: Any] { 7 print(exif) 8 } 9 } 10 } 11}

投稿2020/05/22 00:09

編集2020/05/22 00:53
hayabusabusash

総合スコア767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

data7600

2020/05/22 00:51

回答ありがとうございます。 info.plist に Privacy - Photo Library Usage Description の記載は大丈夫です。 上記コードで三行目、asset.requestContentEditingInpu のところでtが抜けていました。 で補完して試してみましたがうまく行かず、原因を探ると、 asset = info[.phAsset] がnilでした。 PHAssetもよくわかっていないのでそちら方面から調べてみようと思います。
hayabusabusash

2020/05/22 00:56

asset.requestContentEditingInput に修正しました。失礼いたしました????‍♂️ 写真ライブラリへのアクセスが許可されていない場合は nil になるので、 アクセスが許可されているか、そもそも許可をリクエストする処理がされているかを確認していただけないでしょうか????‍♂️
data7600

2020/05/22 01:17

おおっ、写真ライブラリへのアクセスは以前のように自動では聞かれなくなっているのですね。 聞かれていないので前に許可したのかな?くらいで意識の外でした。 写真ライブラリへのアクセスを確認して許可を出すようにすれば教えていただいたコードで欲しい情報が得られました。 ありがとうございました!\(^o^)/
hayabusabusash

2020/05/22 01:20

よかったです! PHAsset の場合は PHPhotoLibrary.requestAuthorization で認証の許可が必要なので、 アラートで表示される形になります。 通常のようにピッカーから写真を選んでくるだけのケースとはちょっと違うので注意してください????‍♂️
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問