2012-05-29 41 views
9

Tôi đang sử dụng ELCImagePickerController trong ứng dụng của mình và tôi không muốn lưu fullScreenImage đã chọn vào mảng của mình vì nếu tôi đã chọn 40 hình ảnh iPad thì điều đó không tốt.Làm cách nào để lấy dữ liệu từ UIImagePickerControllerReferenceURL?

Tôi muốn nhận dữ liệu từ UIImagePickerControllerReferenceURL thay vì UIImagePickerControllerOriginalImage từ nguyên tắc của phương pháp - (void)elcImagePickerController:(ELCImagePickerController *)picker didFinishPickingMediaWithInfo:(NSArray *)info.

Tôi đã thử:

NSDictionary *dict = [info objectAtIndex:count];    

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",[dict objectForKey:@"UIImagePickerControllerReferenceURL"]]]];//UIImagePNGRepresentation([UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@",[dict objectForKey:@"UIImagePickerControllerReferenceURL"]]]); 
     NSLog(@"length %d",[data length]); 
     imageview.image = [UIImage imageWithData:data]; 

Tuy nhiên, mỗi khi tôi nhận được 0 byte. Tôi đã thử với tất cả các câu trả lời có sẵn trong diễn đàn nhưng không sử dụng.

Có ai trả lời câu hỏi này không?

Trả lời

26

UIImagePickerControllerReferenceURL trả về NSURL đối tượng không phải là đối tượng chuỗi. Vui lòng thay đổi mã của bạn để -

NSData *data = [NSData dataWithContentsOfURL:[dict objectForKey:@"UIImagePickerControllerReferenceURL"]]; 
NSLog(@"length %d",[data length]); 
imageview.image = [UIImage imageWithData:data]; 

UIImagePickerControllerReferenceURL lợi nhuận NSURL đối tượng cho Assets Library, vì vậy bạn có thể nhận được hình ảnh như -

ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init]; 
[assetLibrary assetForURL:[[self.imagedata objectAtIndex:i] valueForKey:UIImagePickerControllerReferenceURL] resultBlock:^(ALAsset *asset) { 
    ALAssetRepresentation *rep = [asset defaultRepresentation]; 
    Byte *buffer = (Byte*)malloc(rep.size); 
    NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil]; 
    NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];//this is NSData may be what you want 
    [data writeToFile:photoFile atomically:YES];//you can save image later 
} failureBlock:^(NSError *err) { 
    NSLog(@"Error: %@",[err localizedDescription]); 
}]; 

Lưu ý: ALAssetsLibrary bị phản đối trong iOS 9.

+0

cảm ơn câu trả lời của bạn ... tôi đã cố gắng như vậy mặc dù trong nhật ký của tôi tôi nhận được chiều dài là 0 "2012-05-29 18: 32: 13.536 myapp [1793: 707] length 0" –

+1

nó là 0 vì UIImagePickerControllerReferenceURL trả về đối tượng NSURL cho Thư viện nội dung. vì vậy bạn cần sử dụng Thư viện nội dung để tải hình ảnh từ url này. As - NSURL * referenceURL = [info objectForKey: UIImagePickerControllerReferenceURL]; Thư viện ALAssetsLibrary * = [[ALAssetsLibrary alloc] init]; [library assetForURL: referenceURL resultBlock:^(ALAsset * asset) {...} failureBlock:^(lỗi NSError *) {...}]; – saadnib

+0

Đối với những gì nó có giá trị ALAssetsLibrary không được chấp nhận trong iOS 9. Tôi đã thêm một câu trả lời bổ sung dưới đây. – Jessedc

1

trong ELCImagePickers "Nội dung đã chọn" bạn có thể làm

-(void)selectedAssets:(NSArray*)_assets { 

"... your code .?.?." 

    NSMutableArray *returnArray = [[NSMutableArray alloc] init]; 

    for(ALAsset *asset in _assets) { 

     NSMutableDictionary *workingDictionary = [[NSMutableDictionary alloc] init]; 
     [workingDictionary setObject:[[asset valueForProperty:ALAssetPropertyURLs] valueForKey:[[[asset valueForProperty:ALAssetPropertyURLs] allKeys] objectAtIndex:0]] forKey:@"UIImagePickerControllerReferenceURL"]; 

".. any other properties you need ?" 

     [returnArray addObject:workingDictionary]; 

    } 
} 

Sau đó, trong lớp học khác của bạn để tiết kiệm từ mảng

- (void) importImagesFromArray:(NSArray *)_images toFolder:(NSString *)folderPath 
{ 
    if ([_images count] > 0) { 

    //... YOUR CODE HERE FOR CHECKING YOUR ARRAY...Maybe a loop or something// 
    // 
    // 
    // 

    //ex: 

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    for (NSDictionary *dict in _images) { 



     [library assetForURL:[dict objectForKey:@"UIImagePickerControllerReferenceURL"] 
       resultBlock:^(ALAsset *asset){ 

        //You Can Use This 

        UIImage *theImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage] 
                  scale:1.0 
                 orientation:[[asset valueForProperty:@"ALAssetPropertyOrientation"] intValue]]; 

        //[....save image blah blah blah...]; 

        /////////////////////////////////////////////////// 
        /////////////////////////////////////////////////// 

        ////// OR YOU CAN USE THIS//////////////////// 

        ALAssetRepresentation *rep = [asset defaultRepresentation]; 
        Byte *buffer = (Byte*)malloc(rep.size); 
        NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil]; 
        NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];//this is NSData may be what you want 
        [data writeToFile:[folderPath stringByAppendingPathComponent:@"Some Filename You Need To Assign"] atomically:YES]; 


       } 

       failureBlock:^(NSError *error){ 
        NSLog(@"Error saving image"); 

       }]; 

     // Dont forget to release library 

    } 
} 
} 
8

Câu hỏi này đứng tốt trên Google cho UIImagePickerControllerReferenceURL vì vậy tôi nghĩ rằng tôi muốn thêm cách chính xác để sử dụng UIImagePickerControllerReferenceURL trong iOS9 và sau đó là ALAssetLibrary đã bị phản đối ủng hộ Khung ảnh.

Cách chính xác để truy cập ảnh bằng cách sử dụng UIImagePickerControllerReferenceURL được cung cấp trong từ điển thông tin từ imagePickerController(_:didFinishPickingMediaWithInfo:) là qua Bộ ảnh PHAsset.

Một thực hiện cơ bản của UIImagePickerControllerDelegate sử dụng hình ảnh Framework để lấy UIImage sẽ giống như thế này:

class YourViewController: UIViewController, UIImagePickerControllerDelegate 
{ 
    public func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]?) { 
     guard let info = info, let url = info[UIImagePickerControllerReferenceURL] as? NSURL else { 
      // Using sourceType .Camea will end up in here as there is no UIImagePickerControllerReferenceURL 
      picker.dismissViewControllerAnimated(true) {} 
      return 
     } 

     let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([url], options: nil) 
     if let photo = fetchResult.firstObject as? PHAsset { 
      PHImageManager.defaultManager().requestImageForAsset(photo, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFill, options: nil) { 
       image, info in 
       // At this point you have a UIImage instance as image 
      } 
     } 
    } 
} 

Đoạn mã trên sẽ không xử lý callbacks khi sourceType là .Camera kể từ khi thông tin từ điển không chứa UIImagePickerControllerReferenceURL.

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