2015-11-19 11 views
5

Sto cercando di aggiungere metadati al mio generato sinteticamente e salvarlo sul rullino fotografico utilizzando il framework Photos. Ho ottenuto il salvataggio e l'editing di lavoro, ma posso solo sembrare di capire come aggiungere i metadati. Ho provato molti approcci come aggiungere i metadati creando un'immagine CoreGraphics (vedi il codice sotto). Tutti questi approcci non mi danno un errore ma non riesco a vedere i metadati quando apro l'immagine sul mio Mac.Salvare i metadati per l'immagine personalizzata con Swift (iOS) e Photos framework

Qualcuno può indicarmi la giusta direzione qui?

PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 
let assets : PHFetchResult = PHAsset.fetchAssetsWithLocalIdentifiers([self.localIdentifier], options: nil); 
let asset : PHAsset = assets[0] as! PHAsset; 
let changeRequest = PHAssetChangeRequest(forAsset: asset); 
changeRequest.location = self.currentLocation; 

asset.requestContentEditingInputWithOptions(nil, completionHandler: { (input: PHContentEditingInput?, 
    info: [NSObject : AnyObject]) -> Void in 


    guard let input = input else { return } 

    let imageManager : PHImageManager = PHImageManager(); 
    let requestoptions : PHImageRequestOptions = PHImageRequestOptions(); 
    requestoptions.resizeMode = PHImageRequestOptionsResizeMode.None; 

    imageManager.requestImageForAsset(asset, targetSize: PHImageManagerMaximumSize, contentMode: PHImageContentMode.Default, options: PHImageRequestOptions(), resultHandler: { (let image : UIImage?, _) -> Void in 

     let output : PHContentEditingOutput = PHContentEditingOutput(contentEditingInput: input); 

     PHPhotoLibrary.sharedPhotoLibrary().performChanges({() -> Void in 

      let changeRequest = PHAssetChangeRequest(forAsset: asset); 

      /* Neu */ 
      let imageData : NSData = NSData(contentsOfURL: (input.fullSizeImageURL)!)!; 
      let image : CIImage = CIImage(data: imageData)!; 
      let dataPtr = CFDataCreate(kCFAllocatorDefault, UnsafePointer<UInt8>(imageData.bytes), imageData.length) 


      // Save off the properties 
      let imageSource : CGImageSourceRef = CGImageSourceCreateWithData(dataPtr, nil)!; 
      var metadata : NSMutableDictionary = NSMutableDictionary(dictionary: CGImageSourceCopyProperties(imageSource, nil)!); 



/* Add some values to metadata */ 
.... 

      NSLog("New metadata: %@", metadata); 

      // Save the image 
      let outputImageSource : CGImageSourceRef = CGImageSourceCreateWithData(dataPtr, nil)!; 
      let jpegData : CFMutableDataRef = CFDataCreateMutable(kCFAllocatorDefault, 0); 
      let outputDestination : CGImageDestinationRef = CGImageDestinationCreateWithData(jpegData, CGImageSourceGetType(outputImageSource)!, 1, nil)!; 

      // add the image data to the destination 
      CGImageDestinationAddImageFromSource(outputDestination, outputImageSource, 0, metadata); 

      if CGImageDestinationFinalize(outputDestination) 
      { 
       NSLog("Successful image creation."); 
       // process the image rendering, adjustment data creation and finalize the asset edit. 
      } 
      else 
      { 
       NSLog("Image creation failed."); 
      } 



      (jpegData as NSData).writeToURL(output.renderedContentURL, atomically: true); 


      let options : String = NSString(format: "%f|%f|%f|%f|%f|%f", self.saturationSlider.value, self.warmthSlider.value, self.brightnessSlider.value, self.sharpnessSlider.value, self.contrastSlider.value, self.gammaSlider.value) as String; 
      let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]; 

      output.adjustmentData = PHAdjustmentData(formatIdentifier: NSBundle.mainBundle().bundleIdentifier!, 
       formatVersion: nsObject as! String, 
       data: options.dataUsingEncoding(NSUTF8StringEncoding)!); 

      changeRequest.contentEditingOutput = output; 

      }, completionHandler: { (_bool, _error) -> Void in 
       if !_bool && error != nil 
       { 
        NSLog("%@", error!); 
       } 
     }); 
    }); 
}); 
}, completionHandler: { (_bool, _error) -> Void in 
}); 
+0

Più di un anno dopo, ma sto trovando gli stessi risultati. Nessun errore, ma nessun metadato personalizzato, neanche. Mentre il framework Photos pubblicizza i "metadati di modifica" per una risorsa, chiaramente non offre la modifica dei metadati di tipo EXIF ​​reali. – snakeoil

+0

Mi sono imbattuto nello stesso problema. Ho pubblicato la mia versione di questa domanda https://stackoverflow.com/questions/48255636/editing-photo-metadata-and-phadjustmentdata. Sembra che la modifica delle proprietà exif funzioni se l'immagine ha già un PHAdjustmentData collegato da un'altra applicazione. Alla fine ho rinunciato e ho aggiunto un ID alla proprietà del commento exif sulla creazione dell'immagine e l'ho usato per indicizzare un dizionario che memorizzava i metadati aggiuntivi che avevo archiviato in Core Data. – Spads

risposta

-2

È possibile aggiungere/impostare alcune proprietà sull'oggetto creationRequest. Non so se aggiungere metadati personalizzati.

PHPhotoLibrary.shared().performChanges({ 

    let creationRequest = PHAssetChangeRequest.creationRequestForAsset(from: self.anImage!) 

    let aLocation = CLLocation(latitude: 27.63866, longitude: -80.39707) 

    creationRequest.location = aLocation 

    creationRequest.isFavorite = true 

    creationRequest.creationDate = Date() 

}, completionHandler: {success, error in 
    if !success { 
     print("error creating asset: \(error!)") 
    } else { 
     print("success creating asset!") 
    } 
}) 
Problemi correlati