2012-05-29 3 views
9

Я использую ELCImagePickerController в своем приложении, и я не хочу сохранять выбранный fullScreenImage в свой массив, потому что, если я выбрал 40 изображений iPad, то это не хорошо.Как получить данные из UIImagePickerControllerReferenceURL?

Я хочу получить данные от UIImagePickerControllerReferenceURL вместо UIImagePickerControllerOriginalImage по типу метода - (void)elcImagePickerController:(ELCImagePickerController *)picker didFinishPickingMediaWithInfo:(NSArray *)info.

Я попытался:

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]; 

Однако, каждый раз, когда я получаю 0 байт. Я пробовал со всеми ответами, доступными на форуме, но бесполезно.

Может ли кто-нибудь ответить на это, пожалуйста?

ответ

26

UIImagePickerControllerReferenceURLNSURL объект не строковый объект. Пожалуйста, измените свой код -

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

UIImagePickerControllerReferenceURL возвращает NSURL объекта для Assets Library, так что вы можете получить изображение -

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]); 
}]; 

Примечания: ALAssetsLibrary осуждается в прошивке 9.

+0

спасибо за ваш ответ ... я так пробовал, даже если в моем журнале я получаю длину как 0 "2012-05-29 18: 32: 13.536 myapp [1793: 707] length 0" –

+1

это 0 потому что UIImagePickerControllerReferenceURL возвращает объект NSURL для библиотеки активов. поэтому вам нужно использовать библиотеку активов, чтобы получить изображение с этого URL-адреса. As - NSURL * referenceURL = [info objectForKey: UIImagePickerControllerReferenceURL]; Библиотека ALAssetsLibrary * = [[ALAssetsLibrary alloc] init]; [library assetForURL: referenceURL resultBlock:^(ALAsset * asset) {...} failureBlock:^(ошибка NSError *) {...}]; – saadnib

+0

За что стоит ALAssetsLibrary устарела в iOS 9. Я добавил дополнительный ответ ниже. – Jessedc

1

в ELCImagePickers «Выбранные активы» вы можете сделать

-(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]; 

    } 
} 

Затем в другом классе, чтобы спасти от массива

- (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

Этот вопрос занимает хорошо на Google для UIImagePickerControllerReferenceURL, так что я думал, что я хотел бы добавить правильный способ использовать UIImagePickerControllerReferenceURL в iOS9, а позднее ALAssetLibrary устарела в пользу рамки фотографий.

Правильный способ доступа к фотографии с использованием UIImagePickerControllerReferenceURL, предоставленный в информационном словаре от imagePickerController(_:didFinishPickingMediaWithInfo:) через Фото Kit PHAsset.

Основная реализация UIImagePickerControllerDelegate с использованием фотографии Framework для извлечения UIImage будет выглядеть примерно так:

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 
      } 
     } 
    } 
} 

Код выше не будет обрабатывать обратные вызовы, когда SourceType является .Camera, так как информация словарь не содержит UIImagePickerControllerReferenceURL.

Смежные вопросы