【Swift】画像のExifデータを編集してみる、UserCommentの読み込みと書き込み

画像のexif情報の読み込みと書き込みができました。

「ユーザーコメント(UserComment)」の内容を編集してみました。

画像読み込み時、imagePickerController 関数の中で「選択された画像」と「metaデータ」を保持して、
画像書き込み時、metaデータを編集して画像と共に保存する。
(※オリジナルの画像は残る)

import ImageIO
import Photos
import MobileCoreServices
var meta:NSDictionary? = nil
var selImage:UIImage? = nil

exif読み込み

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
picker.dismiss(animated: false, completion: nil)
selImage = info[UIImagePickerControllerOriginalImage] as! UIImage?
let assetUrl:NSURL = (info[UIImagePickerControllerReferenceURL] as! NSURL?)!
let url = NSURL(string: (assetUrl.description))!
let result = PHAsset.fetchAssets(withALAssetURLs: [url as URL], options: nil)
let asset:PHAsset = result.firstObject! as PHAsset
let editOptions = PHContentEditingInputRequestOptions()
editOptions.isNetworkAccessAllowed = true
asset.requestContentEditingInput(with: editOptions, completionHandler: { (contentEditingInput, _) -> Void in
let url = contentEditingInput?.fullSizeImageURL
let inputImage:CIImage = CoreImage.CIImage(contentsOf: url!)!
//self.meta = inputImage.properties["{Exif}"] as? NSDictionary
self.meta = inputImage.properties as NSDictionary?
let exif:NSDictionary = self.meta!["{Exif}"] as! NSDictionary
print(inputImage.properties)
self.txtUserComment?.text = exif.object(forKey: kCGImagePropertyExifUserComment) as! String?
})
}

exif書き込み

func writeExif(){
let exif:NSDictionary = self.meta!["{Exif}"] as! NSDictionary
exif.setValue(txtUserComment?.text, forKey:kCGImagePropertyExifUserComment as String)
let cg:CGImage = (selImage?.cgImage)!
let meta:NSDictionary = self.meta!
let tmpName = ProcessInfo.processInfo.globallyUniqueString
let tmpUrl = NSURL.fileURL(withPath: NSTemporaryDirectory() + tmpName + ".jpg")
if let dest = CGImageDestinationCreateWithURL(tmpUrl as CFURL, kUTTypeJPEG, 1, nil) {
CGImageDestinationAddImage(dest, cg, meta)
CGImageDestinationFinalize(dest)
PHPhotoLibrary.shared()
.performChanges({ PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: tmpUrl) },
completionHandler: { (ok, err) in
print(ok, err)
let _ = try? FileManager.default.removeItem(at: tmpUrl)
})
}
print("writeUserComment")
}

2016/10/20 追記

2バイト文字の日本語を扱おうとすると、途中で切れる問題がありますね。

今のところ、urlエンコードで全角文字をなくして書き込む方法しか思いつかない。

www.dev-dev.net

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA