Pregunta

¿Podría alguien por favor explicar o mostrar un código de ejemplo de cómo puedo usar obtener una imagen en miniatura para ser puesto en un UIImageView después de que el usuario selecciona una fotografía con UIImagePickerController?

Vamos a decir que quiero establecer una miniatura como la imagen de una célula vista de tabla. Cuando el usuario presiona la célula, se muestra el selector de la imagen y el usuario selecciona una imagen que ya está en su dispositivo. También quiero salvar la ruta a ese miniatura para que la próxima vez que se muestra la vista, la miniatura adecuada puede mostrarse.

Soy capaz de mostrar un selector de imágenes y la imagen elegida la mi delegado de conseguir correctamente, pero quiero que el camino a la miniatura, y yo quiero cargar la miniatura utilizando ese camino (es decir, quiero guardar la ruta). He buscado durante horas hoy y no he dado cuenta de esto. Tal vez no soy la comprensión ALAsset, o tal vez algo más, pero no puedo encontrar ningún ejemplo de que me están ayudando. Nunca he utilizado el selector de imágenes o ALAsset antes de ahora, así que estoy completamente nuevo en esto.

¿Fue útil?

Solución

// Si está leyendo esto y ver los comentarios de abajo y pensar ?? WTF ?? es porque estoy editando mi respuesta original en lugar de publicar dos respuestas con la esperanza de que las cosas van a ser más limpio. Es importante saber que ALAssetsLibrary es una cosa 4.x IOS.

El código siguiente función de la voluntad de tomar una URL activo-biblioteca y luego hacer un UIImage fuera de la representación en miniatura. A pesar de que utilizan la URL activo-biblioteca directamente no hay ninguna razón por la que este mismo código no podría empezar por la transformación de una representación de cadena en un NSURL con el fin de satisfacer la asignación imageURL. Exención de responsabilidad:. El código probablemente fugas o algo peor, pero responde a la pregunta del cartel original y es de esperar que el valor

El código siguiente es tomar prestado en gran medida de t su desbordamiento de pila pregunta que las cubiertas básicamente el mismo tema. Además del código aquí, he incluido AssetsLibrary.framework y los typedefs ALAssetsLibrary se hace referencia en la otra pregunta.

El truco es que no se puede hacer referencia a la NSURL a partir de una biblioteca de activos directamente. Creo que (aunque no sé) que es de alguna manera referencia a un almacén de datos en lugar de un archivo para los datos devueltos por la URL no es recta NSData por lo que no se puede utilizar de la manera antigua.

Hay una UIImageView en el código que se llama photo. Esperemos que todo lo demás es fácil de averiguar.

- (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 no quiere la foto completa, se le acaba de cambiar el código en el bloque AssetForURLResult a algo como esto:

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

puede dejar de también que para el usuario.

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

Otros consejos

Lo tengo sobre todo resuelto ahora. La dificultad que tuve fue la comprensión de éstos, sobre todo la sintaxis de los bloques hacía difícil entender lo que 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 la imagen a tamaño completo o una miniatura usando 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 ayudó a entender bloques: bloques en IOS 4
Ver también URL recupera de ALAsset en iPhone

Guardar el URL puede ser problemático:

  1. al menos en iOS 4.x, las direcciones URL no se garantiza que sea único. Ellos pueden ser reutilizados si eliminaciones de usuario / añadir imágenes, lo que obviamente es común. Por lo tanto, la URL que mantuviste puede apuntar a una imagen diferente en el futuro!
  2. Cuando el usuario actualiza a iOS 5, las direcciones URL ya no son válidas. UGH !!! Apple ha reescrito la biblioteca de fotos, sin compatibilidad con versiones anteriores.

Se puede guardar la imagen selecciona a partir imagePicker en documentos Directorio instaed de referencia a ella en el selector Aquí está el código que puede utilizar para guardar la imagen. Implementar este método en el método de devolución de llamada invoca cuando el usuario selecciona una foto del selector

 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top