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

时间:2016-02-19 18:08:01

标签: ios uiimagepickercontroller phasset

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

现在 - 整个过程非常适合用户从库中选择的图片,但不适用于直接由相机拍摄的图片(因为没有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)
    }


}

如何获取已保存图片的网址?

最佳, 乔治

2 个答案:

答案 0 :(得分:0)

我同意你的看法。

但是,如果Image的Exif具有较早的日期。

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。

答案 1 :(得分:0)

我已经更新了答案,包括返回任何资产类型,以及更简单/更干净的返回资产的方法。

不需要比赛处理程序。

func fetchLastAsset() -> PHAsset? {
    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    fetchOptions.fetchLimit = 1
    let fetchResult = PHAsset.fetchAssets(with: fetchOptions)
    return fetchResult.firstObject
}