###前提
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}
動作環境(iOSバージョンなど)や、メタ情報が書き換わっていないことを確認した方法と、別のファイルとして書き出した場合はどのような結果になるのかをご提示されるとよろしいかと思います。
あなたの回答
tips
プレビュー