2015-02-22 15 views
6

Próbuję zrobić odpowiednik writeImageToSavedPhotosAlbum z nową ramką Photo.Schemat fotograficzny: zapisz dane exif z selektora (przysłonę, długość ogniskowej, szybkość migawki, ...)

Aby zapisać obraz, tylko zrobić to:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { 

    let image = info[UIImagePickerControllerOriginalImage] as UIImage 

    PHPhotoLibrary.sharedPhotoLibrary().performChanges({() -> Void in 
       let changeRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image) 
      }, completionHandler: { (success, error) -> Void in 
       // 
      }) 
} 

Oczywiście, nie ma magii, a ponieważ nie wiem nic o

info[UIImagePickerControllerMediaMetadata] 

zrobić, powyższy kod nie zapisz dowolne metadane do "Rolki z aparatu", jak widzisz, korzystając ze zrzutu ekranu Preview.app po podłączeniu mojego iPhone'a do mojego Maca.

enter image description here

dostać ten pogląd otwierając Preview.app, wybierając z menu Plik> Importuj z „ty nazwa urządzenia”; następnie możesz przeglądać zdjęcia i zobaczyć, że zdjęcia zrobione przy użyciu aplikacji Aparat pokazują dane z zakresu np. ogniskowej, podczas gdy zapisane z powyższym kodem pokazują puste wartości. dokumentacja dla creationRequestForAssetFromImage

Teraz mówi:

Aby ustawić właściwości metadanych nowo utworzonego zasobu, użyj odpowiednie właściwości żądanie zmiany (wymienione w Modyfikowanie aktywa).

Które linki do "+ changeRequestForAsset:" i 4 właściwości (creationDate, lokalizacja, ulubione, ukryte), to trochę światła. A co z innymi właściwościami, które można chcieć zapisać (takimi jak przysłona, długość ogniskowej, czas otwarcia migawki, ...)?

W jaki sposób masz zapisać swoje metadane wzdłuż obrazu za pomocą frameworka?

+1

Czy tego dojść? – Steve

+0

Tak Steve, sprawdź moją odpowiedź – Nycen

Odpowiedz

3

Oto, co skończyło się robi:

extension UIImage { 

    /** 
    Gets the metadata from the photo album 

    :param: info The picker dictionary 
    :param: completionHandler A block to call when the metadata is available 
    */ 
    class func requestMetadata(info: [NSObject : AnyObject], completionHandler: ([NSObject : AnyObject]) -> Void) { 
     let assetUrl = info[UIImagePickerControllerReferenceURL] as! NSURL 
     let result = PHAsset.fetchAssetsWithALAssetURLs([assetUrl], options: nil) 
     if let asset = result.firstObject as? PHAsset { 
     let editOptions = PHContentEditingInputRequestOptions() 
     editOptions.networkAccessAllowed = true 

     asset.requestContentEditingInputWithOptions(editOptions, completionHandler: { (contentEditingInput, _) -> Void in 
      let url = contentEditingInput.fullSizeImageURL 
      let orientation = contentEditingInput.fullSizeImageOrientation 
      var inputImage = CoreImage.CIImage(contentsOfURL: url) 
      completionHandler(inputImage.properties()) 
     }) 
    } else { 
     completionHandler([:]) 
    } 
    } 
} 
+1

Nieco mylić, jak to działa z didFinishPickingMediaWithInfo i zapisywanie obrazu do pliku, skąd wywołać ten func od? – Steve

+0

didFinishPickingMediaWithInfo zwraca informacje: [NSObject: AnyObject], wystarczy zadzwonić do requestMetadata z tą wartością – Nycen

+0

Co z zapisywaniem obrazu na Rolce z kamery wraz z metadanymi, jak to zrobić? – mirceapasoi

Powiązane problemy