8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[iOS] 写真のExifデータを編集して、フォトライブラリーに保存する方法

Last updated at Posted at 2023-02-24

これは

画像のExifデータ(metadata)を編集して、
それを保ったままフォトライブラリーに保存したいな〜と思っていましたが、案外情報がなかったのでまとめてみました。
(現在Deprecatedになっている情報が多かった)

実装

Exifの読み込み

// URLからCGImageSourceを作成 URLはPHPickerViewControllerから取得を想定
let cgImageSource = CGImageSourceCreateWithURL(url as CFURL, nil)
// Exif
let metadata = CGImageSourceCopyPropertiesAtIndex(cgImageSource, 0, nil) as? [String: Any]
  • 位置情報の場合
var locationDictionary = metadata[kCGImagePropertyGPSDictionary as String] as? [String: Any]

// Latitude & Longitude
locationDictionary[kCGImagePropertyGPSLatitude as String]
locationDictionary[kCGImagePropertyGPSLongitude as String]

このほかのそれぞれのキー値はこちらを参照

Exifへの書き込み

これは先ほど取得した値を使っていきます。

// Latitude & Longitude
locationDictionary[kCGImagePropertyGPSLatitude as String] = "0.000"
locationDictionary[kCGImagePropertyGPSLongitude as String] = "0.000"

// 上書き
metadata[kCGImagePropertyGPSDictionary as String] = locationDictionary

フォトライブラリーに保存

 // 書き込み用のCGImageを作成
guard let cgImage = CGImageSourceCreateImageAtIndex(cgImageSource, 0, nil) else { return }

// 任意の名前をセット
let tmpName = UUID().uuidString
// URLを作成
let tmpUrl = NSURL.fileURL(withPath: NSTemporaryDirectory() + tmpName + ".jpeg")

if let _ = CGImageDestinationCreateWithURL(tmpUrl as CFURL, UTType.jpeg.identifier as CFString, 1, nil) {
   // 先ほどのmetadaをCGImageに反映する
   CGImageDestinationAddImage(destination, cgImage, metadata as CFDictionary)
   // 指定したURLに書き込み
   CGImageDestinationFinalize(destination)

   PHPhotoLibrary.shared().performChanges({
      // フォトライブラリーに書き込み
      PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: tmpUrl)
   }, completionHandler: { success, error in
      print("performChanges success: \(success), error: \(error?.localizedDescription)")
      // tmpFile削除する
   })
}

ポイントはCGImageDestinationFinalizeを使って適当な場所に保存してしまうこと
そこからPhotoKitPHPhotoLibraryを使って、フォトライブラリーに保存してあげてください

終わり

その他

フォトライブラリーに保存する際にUIImageに変更してしまうと、Exifが欠損してしまうので注意

参考

ドキュメント: https://developer.apple.com/documentation/imageio
stackoverflow: https://stackoverflow.com/questions/51987255/save-images-to-photos-gallery-in-ios-with-exif-data-using-swift
サンプルプロジェクト: https://github.com/Take111/PhotoPickerSample

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?