🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
GPS

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

6149閲覧

swift カメラで撮影したときに記録される情報

AppDvl

総合スコア58

GPS

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2019/09/29 05:04

編集2019/10/13 02:28

◎したいこと
カメラでカメラで撮影したら、その情報(exifやGPS情報)を一覧表に記録したい。
◎わからないこと
exifデータはprintできたので取得できています。しかし、GPS情報(dopや衛星数)が取得できない。
◎聞きたいこと
リファレンスにkCGImagePropertyGPSDictionaryがあったので記録されているものと思っていましたが、そもそもGPS情報(dopや衛星数)は写真を撮ったときに記録されていないのでしょうか?
◎kCGImagePropertyExifDictionaryの呼出し方(使い方)は正しいか?

ファレンスのURL
CGImage プロパティ
https://developer.apple.com/documentation/imageio/cgimageproperties

gpsディクショナルキー
https://developer.apple.com/documentation/imageio/cgimageproperties/gps_dictionary_keys

swift

1 2import UIKit 3 4class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 5 6 @IBOutlet weak var imageView: UIImageView! //UIImageView 7 @IBAction func launchCamera(_ sender: UIBarButtonItem) {//ツールバーのボタンこの場合カメラボタンに変更済み 8 let camera = UIImagePickerController.SourceType.camera 9 //カメラが利用可能かチェック 10 if UIImagePickerController.isSourceTypeAvailable(camera) { 11// インスタンスの生成 12 let picker = UIImagePickerController() 13 picker.sourceType = camera 14 picker.delegate = self 15 self.present(picker, animated: true) 16 } 17 } 18// 撮影が完了時した時に呼ばれる 19 func imagePickerController(_ picker: UIImagePickerController, 20 didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 21// 画像のデータを取得する 22 let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage 23 self.imageView.image = image 24 25 //写真のメターデータを取得 26 let metadata = info[UIImagePickerController.InfoKey.mediaMetadata] as? NSDictionary 27 let gpsdata = info[UIImagePickerController.InfoKey.mediaMetadata] as? NSDictionary 28 29 // Exifの参照を取得 30 let exif = metadata?.object(forKey: kCGImagePropertyExifDictionary) 31 print(exif) 32 33 // gpsの参照を取得 34 let gps = metadata?.object(forKey: kCGImagePropertyGPSDictionary) 35 print(gps) 36 37 // 撮影した画像をカメラロールに保存 38 UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) 39 self.dismiss(animated: true) 40 } 41 42 override func viewDidLoad() { 43 super.viewDidLoad() 44 // Do any additional setup after loading the view, typically from a nib. 45 } 46 47 48}

イメージ説明
イメージ説明

コード改変

import UIKit import PlaygroundSupport let fileUrl = Bundle.main.url(forResource: "test", withExtension: "jpg") let image = UIImage(named:"test.jpg")! //let fileUrl = PlaygroundSupport.playgroundSharedDataDirectory.appendingPathComponent("test.jpg") //let image = UIImage(contentsOfFile: fileUrl.absoluteString) // 以下を該当箇所にコピペすれば良さそうです。 let options = [kCGImageSourceShouldCache as String: kCFBooleanFalse] if let data = NSData(contentsOf: fileUrl!), let imgSrc = CGImageSourceCreateWithData(data, options as CFDictionary) { let metadata = CGImageSourceCopyPropertiesAtIndex(imgSrc, 0, options as CFDictionary) as? [String : AnyObject] if let gpsData = metadata?[kCGImagePropertyGPSDictionary as String] { print(gpsData) } else { print("GPS Data load failed...") } }

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

カメラアプリで写真を取った時に位置情報を付加するかどうかはユーザ設定からオン・オフできます。
https://enjoy.sso.biglobe.ne.jp/archives/location_info/

こちらがオフになっていたりしないでしょうか?

[追記] Playgroundでの結果を掲載
イメージ説明

投稿2019/09/29 09:03

編集2019/10/13 02:59
Kapustin

総合スコア1186

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

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

AppDvl

2019/09/29 10:23

Kapustinさん 確認しましたが、位置情報はオンになっています。 kCGImagePropertyExifDictionaryの使い方がダメなのでしょうか?
Kapustin

2019/09/29 13:08

詳しく調べてないので上記でうまくいかない原因はわかりませんが、Playgroundでざっと実装してみた結果、下記のコードであればGPS情報の取得ができることが確認できました。 ``` import UIKit import PlaygroundSupport let fileUrl = PlaygroundSupport.playgroundSharedDataDirectory.appendingPathComponent("test.jpg") let image = UIImage(contentsOfFile: fileUrl.absoluteString) // 以下を該当箇所にコピペすれば良さそうです。 let options = [kCGImageSourceShouldCache as String: kCFBooleanFalse] if let data = NSData(contentsOf: fileUrl), let imgSrc = CGImageSourceCreateWithData(data, options as CFDictionary) { let metadata = CGImageSourceCopyPropertiesAtIndex(imgSrc, 0, options as CFDictionary) as? [String : AnyObject] if let gpsData = metadata?[kCGImagePropertyGPSDictionary as String] { print(gpsData) } else { print("GPS Data load failed...") } } ``` 参考: https://stackoverflow.com/questions/29450629/ios-swift-how-to-get-a-gps-metadata-from-just-a-uiimage-nsurl
AppDvl

2019/09/30 08:40

PlaKapustinさん import PlaygroundSupportを始めてみましたので不安ですが、つまり let fileUrl = PlaygroundSupport.playgroundSharedDataDirectory.appendingPathComponent("test.jpg") の箇所をファイルを保存したURLに変えれば動くってことで良いでしょうか。経験が浅いもので「当該箇所に」実装するのに時間がかかりそうなので、先に返信いたします。
Kapustin

2019/09/30 09:07

PlaygroundSupport.playgroundSharedDataDirectory.appendingPathComponent("test.jpg") の箇所をファイルを保存したURLに変えれば動くってことで良いでしょうか。 > はい、それでやりたいことは実現できるかと思われます!
AppDvl

2019/10/06 06:05 編集

Kapustinさん 言われたとおり、macの書類フォルダに"Shared Playground Data" というフォルダを作りその中に"test.jpg"を置いて、教えていただいたコードをPlaygroundで実行してみましたが画像用に5行目でnilになって、print()の内容も表示されません。 何度もご回答いただいているのに、数日いじってみたのですがどうしても分からないので、もう一度教えてもらえないでしょうか?
Kapustin

2019/10/06 11:03

let image = UIImage(contentsOfFile: fileUrl.absoluteString) がnilになるということですね? そうなると、画像ファイルのパスが正しくないことが原因かと思われます。 ~/Documents/Shared Playground Data/test.jpg にファイルは存在しますか?ファイル名やフォルダ名などに間違いはないでしょうか?
AppDvl

2019/10/13 02:30 編集

Kapustinさん 何度もすいません。 ~/Documents/Shared Playground Data/test.jpg がどうしてもnilになるのでファイルの指定方法を変えました。 (Resourcesフォルダにtest.jpgを置いて、それを指定した) しかし結局、上記のようにGPS情報(dopや衛星数)が取得できません。 Kapustinさんの環境でも同じ用に"GPS Data load failed...\n"になりますか?
Kapustin

2019/10/13 03:06 編集

いえ、Resourcesにtest.jpgを入れ、上記のコードで実行してみましたが、きちんとGPS情報が取得されます。(追記したスクリーンショットはオリジナルのコードでの実行結果ですが、Resourcesフォルダから取得しても確かに同じ結果になります) おそらく画像の指定はできているような感じなので、もしかしてtest.jpgにGPS情報がないとか・・・? test.jpgを「プレビュー」アプリで開き、ツール > インスペクタを表示 > 詳細情報インスペクタ( (i)タブ) の中に「GPS」タブはありますか?あればそこにGPS情報が出てくるはずです。
AppDvl

2019/10/13 03:25

Kapustinさん 開発中のカメラアプリで撮影した画像(test.jpg)を使っていたので"GPS Data load failed...\n"になってしまっていたようです。純正のカメラアプリで撮影した画像を使ったらGPS情報が表示されました。 大変勉強になりました。~/Documents/Shared Playground Data/test.jpgがnilになる件は謎のままですが、なんとか出来たようです。 GPS情報(dopや衛星数)は撮影時に記録するようなコードが必要みたいです。→この機能についてはまた研究してみます。 親切に対応いただいてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問