2015-08-08 14 views
6

Info: Verwenden von Swift und der CGImageSourceCreateWithURL-Funktion.Swift Access EXIF ​​Dictionary

Ich versuche, eine Datei von einer URL zu laden und dann ein Wörterbuch zu bearbeiten, das alle Daten von diesem bestimmten Foto enthält.

Dies ist der Code aus der .swift-Datei.

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) 

Obwohl Bildeigenschaften druckt alle Daten wie zu erwarten wäre, keine Materie, was ich attmpted vom imageProperties Wörterbuch zu extrahieren - es immer als null zurückgeführt wird - wie ‚Öffnung‘ im Beispiel. Die imageProperties wird wie folgt gedruckt:

[{TIFF}: { 
    Artist = JOHN; 
    Copyright = "[email protected]"; 
    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.. 

ich eine Menge Forschung und Tests durchgeführt habe, und ich kann einfach nicht herausfinden, was ich falsch mache, die Elemente in diesem Wörterbuch zugreifen - Könnte mir jemand ein Beispiel geben, wie ich eine Variable als die eingestellte würde "Model" -Element im Wörterbuch?

Vielen Dank für jede Hilfe, John

Antwort

6

zu Exif Parameter gehen Sie wie folgt zu bekommen:

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!)") 
+0

Gibt es eine Möglichkeit, Kamerainformationen aus der Fotobibliothek zu erhalten? Danke –

+1

Ja, ich habe meine Antwort bearbeitet, um ein Beispiel zu zeigen, wie man es im neuesten Swift/Xcode macht – Cortex

9

In Swift 3.0 fand ich die folgende Lösung

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] 

Jetzt können Sie zugreifen die Exif-Tags von zum Beispiel

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

Sie erhalten optionale Werte und Sie müssen testen, ob es Werte oder Null gibt. Eine Liste der verfügbaren Eigenschaftskonstanten finden Sie unter apple documentation.