首页 文章

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

提问于
浏览
6

我有一个使用 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

    更新:似乎我找到了这个问题的答案 .

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

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

    这是异步完成的,因此请确保在操作完成时设置选择器 .

    第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,而是不会更改的唯一标识符 . 这样,您就可以完美地访问保存的图像 .

    希望这有助于他人!

  • 2

    我同意你的看法 .

    但是,如果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 .

相关问题