2015-05-12 23 views
10

Tôi đang sử dụng UIImagePickerController trong hai trường hợpLàm thế nào để có được địa chỉ URL của một hình ảnh vừa được thêm vào trong PHPhotoLibrary

  • để chọn một hình ảnh hiện trong thư viện ảnh
  • để chụp ảnh mới

Trong trường hợp đầu tiên, khi tôi chọn hình thức thư viện, tôi có thể dễ dàng lấy URL theo phương thức ủy nhiệm:

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    // Get the URL 
    NSURL *url = [info valueForKey:UIImagePickerControllerReferenceURL]; 
    ... 
} 

Nhưng khi tôi chụp ảnh mới, hình ảnh chưa có trong thư viện ảnh và chưa có URL. Vì vậy, trước tiên tôi cần phải thêm hình ảnh trong Thư viện. Nhưng sau đó, cách lấy URL của nội dung mới?

Đây là mã của tôi để thêm hình ảnh trong thư viện ảnh

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    // Get the image 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 

    // Add the image in the library 
    [[PHPhotoLibrary sharedPhotoLibrary] 

     performChanges:^ 
     { 
      // Request creating an asset from the image. 
      PHAssetChangeRequest *createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; 

      // Get the URL of the new asset here ? 
      ... 
     } 

     completionHandler:^(BOOL success, NSError *error) 
     { 
      if (!success) { ...; return; } 

      // Get the URL of the new asset here ? 
      ... 
     } 
    ]; 
} 

Trả lời

4

Tôi không tìm được cách để lấy URL, nhưng có thể localIdentifier có thể giúp bạn thực hiện công việc tương tự.

sử dụng

NSString* localId = [[assetChangeRequest placeholderForCreatedAsset] localIdentifier]; 

để có được ID của địa phương và có được hình ảnh sau.

__block NSString* localId; 
// Add it to the photo library 
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
    PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; 

    if (self.assetCollection) { 
     PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:self.assetCollection]; 
     [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]]; 
    } 
    localId = [[assetChangeRequest placeholderForCreatedAsset] localIdentifier]; 
} completionHandler:^(BOOL success, NSError *error) { 
    PHFetchResult* assetResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[localId] options:nil]; 
    if (!success) { 
     NSLog(@"Error creating asset: %@", error); 
    } else { 
     PHFetchResult* assetResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[localId] options:nil]; 
     PHAsset *asset = [assetResult firstObject]; 
     [[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { 
      UIImage* newImage = [UIImage imageWithData:imageData]; 
      self.imageView.image = newImage; 
     }]; 
    } 
}]; 
+0

Điều này làm việc, nhưng cảm thấy rất đáng sợ, tôi không biết nếu nó thực sự sẽ xảy ra, nhưng cách tiếp cận này có thể dẫn đến một điều kiện chủng tộc. –

+0

tình trạng chủng tộc nào? tôi sẽ không chắc chắn nếu localIdentifier có sẵn chưa –

+0

xin chào, bạn có thể vui lòng cho biết đó là self.assetCollection ở đây không, lớp đó là gì, cảm ơn –

1

Nếu chúng ta sử dụng ALAssetsLibrary, nó rất đơn giản để lưu hình ảnh trong Album Ảnh và nhận được URL của nó:

// Get the image 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 

    // Add the image in the Photo Library 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library writeImageToSavedPhotosAlbum: [image CGImage] 
           orientation: (ALAssetOrientation)[image imageOrientation] 
          completionBlock: ^(NSURL *assetURL, NSError *error) 
    { 
     if (error) 
     { 
      NSLog(@"error: %@", error); 
     } 
     else 
     { 
      NSLog(@"assetURL = %@", assetURL); 
     } 
    }]; 

Nhưng đáng ngạc nhiên dường như không thể làm điều tương tự với PHPhotoLibrary mới!

Một giải pháp để có kết quả tương tự với PHPhotoLibrary luôn được chào đón.

+0

ALAssetsLibrary somtimes không thể tạo nhóm, – passol

+5

ALAssetsLibrary được ** phản đối ** và không nên được sử dụng nữa. –

1

Tôi không thích điều này vì điều này có thể dẫn đến tình trạng chạy đua. Cho đến nay tôi không thể nghĩ ra một giải pháp tốt hơn. Nếu ai đó làm tôi rất muốn nghe nó :) Dù bằng cách nào, đây là một Swift-phiên bản của câu trả lời Rigel Chen của

import Photos 

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 

    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { 

     var localId:String? 
     let imageManager = PHPhotoLibrary.sharedPhotoLibrary() 

     imageManager.performChanges({() -> Void in 

      let request = PHAssetChangeRequest.creationRequestForAssetFromImage(image) 
      localId = request.placeholderForCreatedAsset?.localIdentifier 

      }, completionHandler: { (success, error) -> Void in 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 

        if let localId = localId { 

         let result = PHAsset.fetchAssetsWithLocalIdentifiers([localId], options: nil) 
         let assets = result.objectsAtIndexes(NSIndexSet(indexesInRange: NSRange(location: 0, length: result.count))) as? [PHAsset] ?? [] 

         if let asset = assets.first { 
          // Do something with result 
         } 
        } 
       }) 
     }) 
    } 
} 
+0

Điều này là tốt tôi lên bình chọn nhưng tôi curios để biết những gì lợi ích là dòng này làm cho assets = result.objectsAtIndexes (NSIndexSet (indexesInRange: NSRange (vị trí: 0, length: result.count))) như thế nào? [PHAsset] ?? [] chúng tôi vẫn có thể thực hiện result.firsObject – SunilG

Các vấn đề liên quan