2016-02-19 131 views
4

我有一個應用程序使用UIImagePickerController從相機和照片庫中檢索照片。 在圖像選擇器代理中,我只想保存拾取圖像的NSURL(UIImagePickerControllerReferenceURL)以節省內存。當用戶稍後需要查看圖像時,我直接從照片庫中使用PHCachingImageManager加載它。使用Photos Framework獲取相機拍攝的照片的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) 
    } 


} 

任何想法如何得到保存的圖片的網址是什麼?

最佳, 喬治

+0

Georg,您是否找到解決方案?我在這裏面臨同樣的問題,並沒有找到任何解決方案... – gersonmendes

回答

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,而是一個不會改變的唯一標識符。這樣,您可以完美地訪問保存的圖像。

希望這可以幫助別人!

+0

什麼應該傳遞在「localIdentifier」 – Anny

+0

什麼是localIdentifier字符串在這裏,我怎麼能調用這個方法? – 2017-05-16 09:47:35

-1

我同意你的意見。

但是,如果圖像的Exif具有較早的日期。

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

fetchResult.firstObject不是您剛保存的那個。

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

BTW,我發現了一個其他的方式:

__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。

相關問題