Search code examples
swiftimagesavejpegexif

Save (override) my jpg file with editing EXIF data


Im open and edit EXIF (or TIFF...) data in my jpg file. Please help me save (override) my jpg file with editing data. Working with this simple code:

let fileURL = URL(fileURLWithPath: "/Users/test/Pictures/IMG_2808.jpg")

if let imageSource = CGImageSourceCreateWithURL(fileURL as CFURL, nil) {
    var imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as Dictionary?
    let exifDict = imageProperties?[kCGImagePropertyExifDictionary]

    if let UserComment = exifDict?[kCGImagePropertyExifUserComment] ?? nil {
        print("kCGImagePropertyExifUserComment: \(UserComment)")
    }
    else {
        exifDict!.setValue("My comment...", forKey: kCGImagePropertyExifUserComment as String)
        imageProperties![kCGImagePropertyExifDictionary] = exifDict
        
//      What I should do in the next step for update and override my jpg file on disk?
//      Maybe this is not nice way for this realisation? Please help
//
    }
}

Solution

  • After some test Im found a solution:

    let fileURL = URL(fileURLWithPath: "/Users/test/Pictures/IMG_2808.jpg")
    
    if let imageSource = CGImageSourceCreateWithURL(fileURL as CFURL, nil) {
        var imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as Dictionary?
        let exifDict = imageProperties?[kCGImagePropertyExifDictionary]
    
        if let UserComment = exifDict?[kCGImagePropertyExifUserComment] ?? nil {
            print("kCGImagePropertyExifUserComment: \(UserComment)")
        }
        else {
            exifDict!.setValue("My comment...", forKey: kCGImagePropertyExifUserComment as String)
            imageProperties![kCGImagePropertyExifDictionary] = exifDict
         
            if let imageDestination = CGImageDestinationCreateWithURL(fileURL as CFURL, kUTTypeJPEG, 1, nil) {
    
                CGImageDestinationAddImageFromSource(imageDestination, imageSource, 0, imageProperties as CFDictionary?)
    
                CGImageDestinationFinalize(imageDestination)
            }
        }
    }
    

    I don't know if this solution is true but it works! Please comment if you know more perfected way