2012-05-29 12 views
9

Estoy usando ELCImagePickerController en mi aplicación y no quiero guardar la pantalla completa seleccionada en mi matriz porque si seleccioné 40 imágenes de iPad, entonces eso no es bueno.¿Cómo obtengo los datos de UIImagePickerControllerReferenceURL?

Quiero obtener datos de UIImagePickerControllerReferenceURL en lugar de UIImagePickerControllerOriginalImage del dict del método - (void)elcImagePickerController:(ELCImagePickerController *)picker didFinishPickingMediaWithInfo:(NSArray *)info.

que he intentado:

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

Sin embargo, cada vez que estoy recibiendo 0 bytes. Lo he intentado con todas las respuestas disponibles en el foro pero sin uso.

¿Alguien puede responder esto por favor?

Respuesta

26

UIImagePickerControllerReferenceURL devuelve NSURL objeto no el objeto de cadena. Por favor, cambiar el código para -

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

UIImagePickerControllerReferenceURL vuelve NSURL objeto para Assets Library, para que pueda obtener la imagen como -

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

Nota: ALAssetsLibrary está en desuso en iOS 9.

+0

gracias por su respuesta ... intenté así también aunque en mi log estoy obteniendo longitud como 0 "2012-05-29 18: 32: 13.536 myapp [1793: 707] longitud 0" –

+1

es 0 porque UIImagePickerControllerReferenceURL devuelve el objeto NSURL para la Biblioteca de activos. por lo que debe usar la Biblioteca de activos para obtener imágenes de esta url. As - NSURL * referenceURL = [info objectForKey: UIImagePickerControllerReferenceURL]; ALAssetsLibrary * library = [[ALAssetsLibrary alloc] init]; [library assetForURL: referenceURL resultBlock:^(ALAsset * asset) {...} failureBlock:^(NSError * error) {...}]; – saadnib

+0

Por lo que vale, ALAssetsLibrary está en desuso en iOS 9. Agregué una respuesta adicional a continuación. – Jessedc

1

en ELCImagePickers "Activos seleccionados" puede hacer

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

    } 
} 

Luego, en su otra clase de salvar de la gama

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

Esta cuestión está muy bien posicionada en Google para UIImagePickerControllerReferenceURL así que pensé que me gustaría añadir la forma correcta de utilizar UIImagePickerControllerReferenceURL en iOS9 y más tarde como ALAssetLibrary ha quedado obsoleto a favor del Marco de Fotos.

La forma correcta de acceder a la foto usando UIImagePickerControllerReferenceURL incluida en el diccionario de información de imagePickerController(_:didFinishPickingMediaWithInfo:) es a través del Kit de fotos PHAsset.

una implementación básica de UIImagePickerControllerDelegate utilización Marco fotos a buscar el UIImage sería algo como esto:

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

El código anterior no procesará devoluciones de llamada cuando sourceType es .Camera ya que el diccionario de datos no contiene UIImagePickerControllerReferenceURL.

Cuestiones relacionadas