How to write Exif data to image in Swift with lat long
Please check this below answer.you got error due to nil value on EXIFDictionary and GPSDictionary
var image = info[UIImagePickerControllerOriginalImage] as! UIImage let jpeg = UIImageJPEGRepresentation(image, 1.0) var source: CGImageSource? = nil source = CGImageSourceCreateWithData((jpeg as CFData?)!, nil) let metadata = CGImageSourceCopyPropertiesAtIndex(source!, 0, nil) as? [AnyHashable: Any] var metadataAsMutable = metadata var EXIFDictionary = (metadataAsMutable?[(kCGImagePropertyExifDictionary as String)]) as? [AnyHashable: Any] var GPSDictionary = (metadataAsMutable?[(kCGImagePropertyGPSDictionary as String)]) as? [AnyHashable: Any] if !(EXIFDictionary != nil) { EXIFDictionary = [AnyHashable: Any]() } if !(GPSDictionary != nil) { GPSDictionary = [AnyHashable: Any]() } GPSDictionary![(kCGImagePropertyGPSLatitude as String)] = 30.21313 GPSDictionary![(kCGImagePropertyGPSLongitude as String)] = 76.22346 EXIFDictionary![(kCGImagePropertyExifUserComment as String)] = "Hello Image" let UTI: CFString = CGImageSourceGetType(source!)! let dest_data = NSMutableData() let destination: CGImageDestination = CGImageDestinationCreateWithData(dest_data as CFMutableData, UTI, 1, nil)! CGImageDestinationAddImageFromSource(destination, source!, 0, (metadataAsMutable as CFDictionary?)) CGImageDestinationFinalize(destination)
This could be from your destination definition.
This worked for me
(...) let source = CGImageSourceCreateWithData(jpgData as CFData, nil) let finalData = NSMutableData() let destination = getDestination(finalData:finalData, source:source!)(...)// Note that :// NSMutableData type variable will be cast to CFMutableData// fileprivate func getDestination(finalData:CFMutableData, source:CGImageSource)->CGImageDestination?{ guard let destination = CGImageDestinationCreateWithData(finalData, CGImageSourceGetType(source)!, 1, nil)else{return nil} return destination}