2015-11-19 26 views
5

Sentetik olarak oluşturulduğuma meta veriler eklemeye ve Fotoğraflar çerçevesini kullanarak kamera rulosuna kaydetmeye çalışıyorum. Tasarrufu ve düzenleme çalışmasını aldım ancak meta verileri nasıl ekleyeceğimi anlayabiliyorum. Bir CoreGraphics görüntüsü oluşturarak meta verileri eklemek gibi birçok yaklaşımı denedim (aşağıdaki kod). Tüm bu yaklaşımlar bana bir hata vermiyor, ancak Mac'imde görüntüyü açtığımda meta verileri göremiyorum.Swift (iOS) ve Fotoğraflar çerçevesiyle özel görüntü için meta verileri kaydetme

Buraya kimse bana doğru yönde işaret edebilir mi?

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

Bir yıl sonra burada ama aynı sonuçları buluyorum. Hata yok, ancak özel bir meta veri yok. Fotoğraflar çerçevesi bir öğe için "meta verileri düzenleme" olarak tanımlarken, gerçek EXIF ​​türü meta verileri düzenlemeyi açıkça önermez. – snakeoil

+0

Aynı konuyla karşılaştım. Bu soruyu kendi versiyonumda yayınladım https://stackoverflow.com/questions/48255636/editing-photo-metadata-and-phadjustmentdata. Resimde, başka bir uygulamadan eklenen bir PHAdjustmentData varsa exif özellikleri çalışır. Sonunda pes ettim ve görüntü oluşturmadaki exif yorum özelliğine bir kimlik ekledim ve bunu Çekirdek Verilerde saklanan ek meta verileri depolayan bir sözlüğü indekslemek için kullandım. – Spads

cevap

-2

Sen creationRequest nesne üzerinde birkaç özellikleri ayarlamak/ekleyebilir. Özel meta veri eklemeyi bilmiyorum.

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!") 
    } 
})