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

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

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

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

Swift

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

Q&A

0回答

922閲覧

【Swift】端末内の写真メタデータを書き換えたい

abit

総合スコア6

Xcode

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

Swift

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

0グッド

1クリップ

投稿2017/11/26 08:04

編集2017/11/28 02:07

###前提
SwiftでiOSアプリを開発中です. 実機iOSのバージョンは11.0.3
Photos.frameworkで端末内すべての写真を取得しcollectionViewで並べ、1つがタップされるとsegueで選択された画像のphassetのみを次の画面に送信しています.
次の画面はtargetAssetsという変数にデータを受け取った状態からプログラムがスタートします.

###実現したいこと
前画面から受け取った画像データにEXIF情報を付与(もしくは書き換え)し、上書き保存したい

###発生している問題
編集したメタデータと画像データから作られたUIImageは作れたのですが書き込みがうまくいきません.
エラーは無く、performChangeのcompletionHandlerもtrueが返されています

###EXIF情報の確認方法
主に2つの方法で確認しました。

  • 画像データの書き換え前と書き換え後の2回CIImageを作成し、metadataをprintで確認しました。書き換え前はmetadata=nilであり、書き換え後はGPS項目が追加されているのが確認できました。しかし、同じ画像に対しもう一度書き換えを実行した場合に書き換え前のmetadataがnilを示し、本来の画像データの書き換えには成功していないことが確認できました。
  • 書き換えた画像をMacに転送し、ビューアのインスペクタを利用してEXIF情報を覗いてみましたがEXIF情報の追記には成功していませんでした。

###該当のソースコード

Swift

1override func viewDidLoad() { 2 super.viewDidLoad() 3 let manager = PHImageManager.default() 4 let options = PHImageRequestOptions() 5 options.deliveryMode = .highQualityFormat 6 options.isSynchronous = true 7 manager.requestImageData( 8 for: targetAssets, 9 options: options, 10 resultHandler: { data, string, imageorientation, info in 11 self.detail = data as NSData! 12 }) 13 14 let inputOptions = PHContentEditingInputRequestOptions() 15 inputOptions.isNetworkAccessAllowed = true 16 targetAssets.requestContentEditingInput(with: inputOptions) { (input: PHContentEditingInput!, _) -> Void in 17 18 // imageSourceを作成 19 let imageSource = CGImageSourceCreateWithData(self.detail! as CFData, nil) 20 // 画像ソースからプロパティデータを抜き出しDictionary型で保持 21 let metadata = CGImageSourceCopyPropertiesAtIndex(imageSource!, 0, nil)! as NSDictionary 22 // 配列をコピーして新プロパティデータを作成 23 var newMeta: NSMutableDictionary = metadata.mutableCopy() as! NSMutableDictionary 24 // アウトプットデータ 25 let UTI: CFString = CGImageSourceGetType(imageSource!)!; 26 let outputdata = NSMutableData(data: self.detail as! Data); 27 let destination: CGImageDestination = CGImageDestinationCreateWithData(outputdata, UTI, 1, nil)! 28 29 // プロパティ内のEXIF情報を生成(書き換え前) 30 var EXIFDictionary: NSMutableDictionary = (newMeta[kCGImagePropertyExifDictionary] as? NSMutableDictionary)! 31 32 // GPSに関するメタデータ(ネスト構造) 33 var gpsDictionary = [NSObject : Any]() 34 gpsDictionary[kCGImagePropertyGPSLatitude] = fabs(CGFloat(37.031531)) 35 gpsDictionary[kCGImagePropertyGPSLatitudeRef] = "N" 36 gpsDictionary[kCGImagePropertyGPSLongitude] = fabs(CGFloat(124.756228)) 37 gpsDictionary[kCGImagePropertyGPSLongitudeRef] = "E" 38 newMeta.setObject(gpsDictionary, forKey: kCGImagePropertyGPSDictionary as NSString) 39 40 CGImageDestinationAddImageFromSource (destination, imageSource!, 0, (newMeta as CFDictionary?)); 41 let result = CGImageDestinationFinalize(destination); 42 print ("Result: (result)") 43 44 PHPhotoLibrary.shared().performChanges({ 45 let output = PHContentEditingOutput(contentEditingInput: input) 46 let outputNsdata = NSData(data: outputdata as Data) 47 outputNsdata.write(to: output.renderedContentURL, atomically: true) 48 49 }, 50 completionHandler: { (ok, err) in 51 print(ok, err) 52 }) 53}

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

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

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

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

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

t_obara

2017/11/27 04:55

動作環境(iOSバージョンなど)や、メタ情報が書き換わっていないことを確認した方法と、別のファイルとして書き出した場合はどのような結果になるのかをご提示されるとよろしいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問