2015-11-19 23 views
5

私は合成で生成したメタデータにメタデータを追加し、Photosフレームワークを使用してカメラロールに保存しようとしています。私は保存と編集の作業をしましたが、メタデータを追加する方法を理解しているように見えます。 CoreGraphicsイメージを作成してメタデータを追加するなど、さまざまなアプローチを試みました(下記のコードを参照)。これらのアプローチはすべてエラーにはなりませんが、Macで画像を開くとメタデータは表示されません。Swift(iOS)とPhotosフレームワークでカスタム画像のメタデータを保存

誰でも正しい方向に向けることができますか?

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

1年以上後、私は同じ結果を得ています。エラーはなく、カスタムメタデータもありません。 Photosフレームワークはアセットの「編集メタデータ」を宣伝しますが、実際のEXIFタイプのメタデータは編集できません。 – snakeoil

+0

私は同じ問題にぶつかりました。私はこの質問の自分のバージョンを投稿した。https://stackoverflow.com/questions/48255636/editing-photo-metadata-and-phadjustmentdata。画像に既に別のアプリケーションからPHAdjustmentDataが添付されている場合、exifプロパティの編集が機能しているようです。私は最終的にあきらめて、イメージ作成のexif commentプロパティにIDを追加し、これを使用してコアデータに格納されている追加のメタデータを格納している辞書を索引付けしました。 – Spads

答えて

-2

creationRequestオブジェクトにはいくつかのプロパティを追加/設定できます。カスタムメタデータの追加についてはわかりません。

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