使用Photos Framework获取相机拍摄的照片的URL

我有一个应用程序,使用UIImagePickerController从相机和照片库检索图片。 在图像select器委托中,我只想保存所选图像的NSURL( UIImagePickerControllerReferenceURL )以节省内存。 当用户以后需要查看图像时,我直接从照片库中加载PHCachingImageManager。

现在 – 这整个事情与用户从图书馆中select的图片,但没有与相机直接拍摄的照片(因为没有url)很好的作品。 我目前正在试图用PHAsset保存图片,但我不知道如何获得保存图片的NSURL。

这是我一直在做的事情:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { picker.dismissViewControllerAnimated(true, completion: nil) let pickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage if picker.sourceType == .Camera { // When taking a picture with the camera, store it in the user roll PHPhotoLibrary.sharedPhotoLibrary().performChanges( { () -> Void in // save the image PHAssetCreationRequest.creationRequestForAssetFromImage(pickedImage) // TODO how to get the asset url }, completionHandler: { (finished, error) -> Void in if (finished) { } } ) } else { let pickedImageUrl: NSURL? = info[UIImagePickerControllerReferenceURL] as? NSURL currentImageUrl = pickedImageUrl currentImage = pickedImage toggleImageInfoView(true) toggleMapState(true) } } 

任何想法如何获得保存的图片的url?

最好的,乔治

更新:似乎我find了这个问题的答案。

第1步:我将图像保存到相机

 UIImageWriteToSavedPhotosAlbum(image.image, self, #selector(cameraImageSavedAsynchronously), nil) 

这是asynchronous完成的,所以在操作完成后一定要设置一个select器。

第2步:操作完成后,我执行以下操作:

 func fetchLastImage(completion: (localIdentifier: String?) -> Void) { let fetchOptions = PHFetchOptions() fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] fetchOptions.fetchLimit = 1 let fetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: fetchOptions) if (fetchResult.firstObject != nil) { let lastImageAsset: PHAsset = fetchResult.firstObject as! PHAsset completion(localIdentifier: lastImageAsset.localIdentifier) } else { completion(localIdentifier: nil) } } 

我使用PHAsset获取相机胶卷中的最后一个图像,并保存图像的本地标识符。 这不是一个URL,而是一个不会改变的唯一标识符。 这样,您可以完美地访问保存的图像。

希望这可以帮助别人!

我赞同你。

但是,如果图像的Exif有更早的date。

 let fetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: fetchOptions) fetchResult.firstObject 

fetchResult.firstObject不是你刚刚保存的。

也许你可以修改fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false) key: "modificationDate"

顺便说一句,我发现另一种方式:

  __block PHObjectPlaceholder *placeholderAsset = nil; [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ PHAssetChangeRequest *newAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:url]; newAssetRequest.location = location; newAssetRequest.creationDate = [NSDate date]; placeholderAsset = newAssetRequest.placeholderForCreatedAsset; } completionHandler:^(BOOL success, NSError *error) { if(success){ PHAsset *asset = [self getAssetFromlocalIdentifier:placeholderAsset.localIdentifier]; completionBlock(asset, YES); } else { completionBlock(nil, NO); } }]; 

可以得到新的PHAsset。