EXIF Dictionary

Info: using Swift and the CGImageSourceCreateWithURL function.

I am trying to download a file from a URL and then edit a dictionary that has all the data from this particular photo.

This is the code from the .swift file.

let url = NSURL(string: "http://jwphotographic.co.uk/Images/1.jpg") let imageSource = CGImageSourceCreateWithURL(url, nil) let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as Dictionary println(imageProperties) //this is an example let aperture = imageProperties[kCGImagePropertyGPSLatitude] as! NSNumber! /* //these are all being defined as nil //Load the ones from the exif data of the file let lensUsed = imageProperties[kCGImagePropertyExifFocalLength] let aperture = imageProperties[kCGImagePropertyExifApertureValue] as! let isoSpeed = imageProperties[kCGImagePropertyExifISOSpeedRatings] as! NSNumber let latitude = imageProperties[kCGImagePropertyGPSLatitude] as! NSNumber let longitude = imageProperties[kCGImagePropertyGPSLongitude] as! NSNumber let shutterSpeed = imageProperties[kCGImagePropertyExifShutterSpeedValue] as! NSNumber let cameraName = imageProperties[kCGImagePropertyExifBodySerialNumber] as! NSNumber */ println(aperture) 

Despite the fact that the image properties print all the data, as expected, no matter what I did to extract the imageProperties from the dictionary - it always returns as zero - for example, the "aperture" in the example. ImageProperties prints as:

 [{TIFF}: { Artist = JOHN; Copyright = " johnrwatson0@gmail.com "; DateTime = "2015:07:31 21:07:05"; Make = Canon; Model = "Canon EOS 7D Mark II"; ResolutionUnit = 2; Software = "Adobe Photoshop Lightroom 6.0 (Macintosh)"; XResolution = 72; YResolution = 72; }, {IPTC}: { Byline = ( JOHN ); CopyrightNotice = etc.. etc.. 

I have done a lot of research and testing, and I just can’t understand what I am doing wrong to access the elements in this dictionary. Can someone give me an example of how to set a variable as a β€œModel” element inside a dictionary?

Thanks for any help, John

+6
source share
2 answers

In Swift 3.0, I found the following solution

 let url = NSURL(string: "http://jwphotographic.co.uk/Images/1.jpg") let imageSource = CGImageSourceCreateWithURL(url, nil) let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as Dictionary? let exifDict = imageProperties?[kCGImagePropertyExifDictionary] 

Now you can access exif tags, for example,

 let dateTimeOriginal = exifDict?[kCGImagePropertyExifDateTimeOriginal] Swift.print("dateTimeOriginal: \(dateTimeOriginal)") 

You will get additional values, and you will need to check if there are values ​​or not. See the documentation for a list of available property constants.

+9
source

To access Exif options, follow these steps:

  let filePath_ = "file:///Users/pfernandes/Documents/softwareDevelopment/PhotoLine/TestData/IMG_1243.JPG" let fileURL = NSURL(string:filePath_) let myImage = CGImageSourceCreateWithURL(fileURL!,nil) let imageDict = CGImageSourceCopyPropertiesAtIndex(myImage!, 0, nil)! as NSDictionary; let tiffModel_ = imageDict.value(forKey: "{TIFF}") let cameraMake = (tiffModel_ as AnyObject).value(forKey: kCGImagePropertyTIFFMake as String) let cameraModel = (tiffModel_ as AnyObject).value(forKey: kCGImagePropertyTIFFModel as String) let exifDict_ = imageDict.value(forKey: "{Exif}") as! NSDictionary let dateTimeOriginal = exifDict_.value(forKey:kCGImagePropertyExifDateTimeOriginal as String) as! NSString let exposure = exifDict_.value(forKey:kCGImagePropertyExifExposureTime as String) print ("\(String(describing: cameraMake)) \(String(describing: cameraModel)) \(dateTimeOriginal) \(exposure!)") 
+6
source

All Articles