2014-07-17 23 views
10

Sto appena iniziando con swift e cacao. Sto cercando di creare un'app di base che manipoli le immagini.valore di lettura in CFDictionary con swift

ho giá ottenuto tutte le informazioni dell'immagine con questo:

let imageRef:CGImageSourceRef = CGImageSourceCreateWithURL(url, nil).takeUnretainedValue() 
let imageDict:CFDictionaryRef = CGImageSourceCopyPropertiesAtIndex(imageRef, 0, nil).takeUnretainedValue() 

Il dizionario contiene le seguenti informazioni:

{ 
    ColorModel = Gray; 
    DPIHeight = 300; 
    DPIWidth = 300; 
    Depth = 1; 
    Orientation = 1; 
    PixelHeight = 4167; 
    PixelWidth = 4167; 
    "{Exif}" =  { 
     ColorSpace = 65535; 
     DateTimeDigitized = "2014:07:09 20:25:49"; 
     PixelXDimension = 4167; 
     PixelYDimension = 4167; 
    }; 
    "{TIFF}" =  { 
     Compression = 1; 
     DateTime = "2014:07:09 20:25:49"; 
     Orientation = 1; 
     PhotometricInterpretation = 0; 
     ResolutionUnit = 2; 
     Software = "Adobe Photoshop CS6 (Macintosh)"; 
     XResolution = 300; 
     YResolution = 300; 
    }; 
} 

ora mi piacerebbe leggere il valore per il DPI con seguendo il codice e c'è qualche problema con "__conversion" non capisco.

let dpiH:NSNumber = CFDictionaryGetValue(imageDict, kCGImagePropertyDPIWidth) 

cosa sto facendo male e come posso ottenere i valori desiderati del dizionario?

+1

potete inserire l'intero errore che si riceve in Xcode? – Keenle

+0

Arresta la compilazione con quell'errore: "Impossibile eseguire il overload di fing per" __conversion "che accetta gli argomenti forniti" –

+0

Il messaggio di errore sopra non è una copia: "fing". – zaph

risposta

11

Ho trovato molto più semplice accedere alle proprietà "convertendo" CFDictionary in un dizionario Swift.

let imageSource = CGImageSourceCreateWithURL(imageURL, nil) 
let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as Dictionary 
let dpiWidth = imageProperties[kCGImagePropertyDPIWidth] as NSNumber 

aggiornamento rapido per Swift 2.0 (scusate tutti i if let s - Ho appena subito crafted questo codice):

import UIKit 
import ImageIO 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     if let imagePath = NSBundle.mainBundle().pathForResource("test", ofType: "jpg") { 
      let imageURL = NSURL(fileURLWithPath: imagePath) 
      if let imageSource = CGImageSourceCreateWithURL(imageURL, nil) { 
       if let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as Dictionary? { 
        let pixelWidth = imageProperties[kCGImagePropertyPixelWidth] as! Int 
        print("the image width is: \(pixelWidth)") 
       } 
      } 
     } 
    } 
} 
+1

Ho cercato così tanto tempo per una risposta per estrarre informazioni EXIF ​​dalle immagini. Questo l'ha risolto. Grazie! – jonas

+1

Non funziona con Swift 2.0 poiché 'CFDictionaryRef' non può essere castato in' Dictionary' – Darrarski

+1

@Darrarski È possibile eseguire il cast sul dizionario? (nota che deve essere lanciato come opzionale). Ho aggiornato con un rapido esempio. (ps: è molto più carino creare un commento in merito a qualcosa che non funziona più in una nuova versione - piuttosto che giù per il voto). –