読者です 読者をやめる 読者になる 読者になる

【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 追記

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

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

titirobo-develop.hatenablog.jp