2011-01-11 15 views
8

¿Podría alguien explicar o mostrar un ejemplo de código de cómo puedo usar para obtener una miniatura para poner en UIImageView después de que el usuario selecciona una foto con UIImagePickerController?¿Cómo obtengo una miniatura o una ruta de guardado de UIImagePickerController para utilizarla en UIImageView?

Digamos que quiero establecer una miniatura como la imagen de una celda de vista de tabla. Cuando el usuario presiona la celda, se muestra el selector de imágenes y el usuario selecciona una imagen que ya está en su dispositivo. También quiero guardar la ruta a esa miniatura para que la próxima vez que se muestre la vista, se muestre la miniatura correcta.

Soy capaz de mostrar un selector de imágenes y mi delegado obtiene la imagen elegida correctamente, pero quiero la ruta a la miniatura, y quiero cargar la miniatura usando esa ruta (es decir, quiero guardar la ruta). He buscado horas hoy y no me he dado cuenta. Tal vez no entiendo ALAsset, o tal vez sea otra cosa, pero no puedo encontrar ningún ejemplo que me ayude. Nunca antes había usado el selector de imágenes o ALAsset, así que soy completamente nuevo en esto.

Respuesta

15

// Si está leyendo esto y mira los comentarios a continuación y piensa ?? WTF ?? es porque estoy editando mi Respuesta original en lugar de publicar dos Respuestas con la esperanza de que todo esté más limpio. Es importante saber que ALAssetsLibrary es una cosa de iOS 4.x.

El siguiente código funcionará para tomar una URL de biblioteca de recursos y luego hacer un UIImage de la representación en miniatura. Aunque utilizo la URL de la biblioteca de activos directamente, no hay ninguna razón para que este mismo código no pueda comenzar por transformar una representación de cadena en un NSURL para satisfacer la asignación imageURL. Descargo de responsabilidad: este código probablemente gotea o algo peor, pero responde la pregunta del cartel original y es de valor.

El siguiente código toma prestado fuertemente en t his Stack Overflow question que cubre básicamente este mismo tema. Además del código aquí, he incluido AssetsLibrary.framework y ALAssetsLibrary typedefs a los que se hace referencia en la otra pregunta.

El truco es que no se puede hacer referencia al NSURL directamente desde una biblioteca de activos. Creo (aunque no lo sé) que de alguna manera hace referencia a un almacén de datos en lugar de a un archivo, por lo que los datos devueltos por la URL no son NSData directos, por lo que no puede usarlos de la manera antigua.

Hay un UIImageView en el código que se llama photo. Afortunadamente, todo lo demás es fácil de entender.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 
    NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL]; 
    NSLog(@"%@",imageURL); 
    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) 
    { 
     CGImageRef iref = [myasset thumbnail]; 
     if (iref) { 
      UIImage *theThumbnail = [UIImage imageWithCGImage:iref]; 
      [[self photo] setImage:theThumbnail]; 

     } 
    }; 


    ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) 
    { 
     NSLog(@"booya, cant get image - %@",[myerror localizedDescription]); 
    }; 

    if(imageURL) 
    { 
     ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease]; 
     [assetslibrary assetForURL:imageURL 
         resultBlock:resultblock 
         failureBlock:failureblock]; 
    } 

    [self dismissModalViewControllerAnimated:YES]; 
} 

Si no desea que la miniatura, pero sí quieres la foto completa, sólo cambiará el código en el bloque AssetForURLResult a algo como esto:

 ALAssetRepresentation *rep = [myasset defaultRepresentation]; 
    CGImageRef iref = [rep fullResolutionImage]; 

Podemos dejar que ejerza de el usuario.

Buena suerte, espero que esto ayude a aclarar las cosas para usted.

+0

Si el usuario elimina la imagen del rodillo de la cámara, no será un problema, la imagen en mi opinión simplemente se dejará en blanco. La imagen no es una necesidad para el resto de la vista. – viperacr99

+0

La imagen no es necesaria para el resto de la vista. Me estoy dirigiendo a IOS 4.0 y superior. Para hacerlo más fácil, digamos que quiero poner la imagen de tamaño completo en UIImageView. ¿Cómo puedo hacer eso si solo tengo el objeto NSURL del diccionario de información? Las cosas que he intentado hasta ahora no han funcionado, supongo que me falta algo obvio. – viperacr99

+0

El objeto NSURL apunta a la imagen y luego puede descargarla. Dado que tiene como objetivo IOS 4.0, tiene la opción de ir a la Biblioteca de activos. Hay un tutorial en el blog de iCode (http://icodeblog.com/2010/07/08/asset-libraries-and-blocks-in-ios-4/) pero tal vez ya lo haya visto. Una vez que tenga el activo en la mano, puede usar el método valueForPropery y obtener ALAssetPropertyURLs, que es un diccionario que contiene las URL de los archivos. – Walter

0

Puede guardar la imagen que seleccione desde imagePicker en el directorio de documentos instalados para hacer referencia a ella desde el selector Aquí está el código que puede usar para guardar la imagen.Aplicar este método en el método de devolución de llamada se invoca cuando el usuario selecciona una foto en el selector de

NSFileManager fileManager = [NSFileManager defaultManager]; 

    NSArray* output_PDF_paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 

    NSString* output_PDF_documentsDirectory = [output_PDF_paths objectAtIndex:0]; 
    NSString* output_PDF_ABSOLUTE_PATH = [output_PDF_documentsDirectory stringByAppendingPathComponent:@"ImageName.png"]; 

    BOOL success_new = [UIImagePNGRepresentation(ProfilePhotoselected) writeToFile:previewPagePath atomically:YES]; 

// Aquí el "ProfilePhotoselected" es la imagen que se obtiene en el selector como un argumento en su método callabck

+0

Esta es una forma de hacerlo, pero el problema es que también tendré que implementar un código que pueda eliminar imágenes del directorio de documentos que ya no se usan, sin mencionar que solo requerirá más espacio. Idealmente, me gustaría que la imagen solo se guarde en el rollo de la cámara y, si el usuario elimina la imagen de allí, no es gran cosa, mi código simplemente no mostrará una imagen. – viperacr99

2

Lo tengo casi todo resuelto ahora. La dificultad que tenía era entender Blocks, sobre todo la sintaxis de Blocks dificultaba entender qué son y cómo funcionan.

En el delegado para la UIImagePickerController, cuando el usuario ha seleccionado una imagen, se puede obtener la ruta a la imagen en la biblioteca de activos usando:

NSURL *path = [info objectForKey:UIImagePickerControllerReferenceURL]; 

Con ese objeto, se puede obtener el mismo tamaño imagen o una imagen en miniatura utilizando el siguiente código:

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) 
{ 
    ALAssetRepresentation *rep = [myasset defaultRepresentation]; 
    CGImageRef iref = [rep fullResolutionImage]; 
    if (iref) { 
     // Gets the full size image 
     self.fullSizeImage = [UIImage imageWithCGImage:iref]; 
    } 

    // Gets the thumbnail 
    self.thumbnail = [UIImage imageWithCGImage:[myasset thumbnail]]; 
}; 

ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) 
{ 
    NSLog(@"in failureblock, got an error: %@",[myerror localizedDescription]); 
}; 

ALAssetsLibrary *assetsLib = [[ALAssetsLibrary alloc] init]; 
[assetsLib assetForURL:urlForImage resultBlock:resultblock failureBlock:failureblock]; 

Esta página realmente me ayudaron a comprender bloques: Blocks in iOS 4
Véase también display image from URL retrieved from ALAsset in iPhone

1

Guardar el URL puede ser problemático:

  1. al menos en iOS 4.x, las URL no se garantiza que sea único. Se pueden reutilizar si el usuario elimina/agrega imágenes, lo cual es obviamente común. Entonces, ¡la URL que guardaste puede apuntar a una imagen diferente en el futuro!
  2. Cuando el usuario se actualiza a iOS 5, las URL ya no son válidas. UGH !!! Apple ha reescrito Photo Library, sin compatibilidad con versiones anteriores.
Cuestiones relacionadas