2010-10-01 11 views
66

Estoy usando un ALAsset Framework para acceder a los archivos en la galería de fotos del dispositivo.muestra la imagen de la URL recuperada de ALAsset en iPhone

Hasta ahora puedo acceder a la miniatura y mostrarla.
Quiero mostrar la imagen real en una vista de imagen, pero no puedo encontrar la manera de hacerlo.

Intenté utilizar el campo de URLs en el objeto ALAsset pero no tuve éxito.

¿Alguien sabe cómo se puede hacer esto?

Aquí hay un código donde pude acceder a la miniatura y colocarlo en una celda de la tabla:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath { 


    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    //here 'asset' represents the ALAsset object 


    asset = [assets objectAtIndex:indexPath.row]; 
     //i am accessing the thumbnail here 
    [cell.imageView setImage:[UIImage imageWithCGImage:[asset thumbnail]]]; 
    [cell.textLabel setText:[NSString stringWithFormat:@"Photo %d", indexPath.row+1]]; 

    return cell; 
} 
+4

me di cuenta de una manera de hacerlo: \t ALAssetRepresentation * assetRep = [defaultRepresentation activo]; UIImage * image = [UIImage imageWithCGImage: [assetRep fullResolutionImage]]; Pero quiero acceder a él a través de una URL. ayuda ... – Bangdel

Respuesta

93

La API ha cambiado las reglas un poco y no te dan acceso al sistema de archivos directamente a la biblioteca de iPhoto cualquier Más. En cambio, obtienes URL de biblioteca de recursos como esta.

assets-library://asset/asset.JPG?id=1000000003&ext=JPG

se utiliza el objeto ALAssetLibrary para acceder al objeto ALAsset través de la URL.

por lo que desde la documentación para ALAssetLibrary tirar esto en un encabezado (o su fuente)

typedef void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *asset); 
typedef void (^ALAssetsLibraryAccessFailureBlock)(NSError *error); 

que tampoco estrictamente necesario, pero mantiene las cosas bastante.
y luego en su fuente.

-(void)findLargeImage 
{ 
    NSString *mediaurl = [self.node valueForKey:kVMMediaURL]; 

    // 
    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) 
    { 
     ALAssetRepresentation *rep = [myasset defaultRepresentation]; 
     CGImageRef iref = [rep fullResolutionImage]; 
     if (iref) { 
      largeimage = [UIImage imageWithCGImage:iref]; 
      [largeimage retain]; 
     } 
    }; 

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

    if(mediaurl && [mediaurl length] && ![[mediaurl pathExtension] isEqualToString:AUDIO_EXTENSION]) 
    { 
     [largeimage release]; 
     NSURL *asseturl = [NSURL URLWithString:mediaurl]; 
     ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease]; 
     [assetslibrary assetForURL:asseturl 
         resultBlock:resultblock 
         failureBlock:failureblock]; 
    } 
} 

Un par de cosas a tener en cuenta son que este utiliza bloques que eran nuevas para mí antes de comenzar mi iOS4 portar pero es posible que gusta mirar a

https://www.mikeash.com/pyblog/friday-qa-2008-12-26.html

y

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html

Inclinan un poco la cabeza, pero si los considera selectores de notificaciones o devoluciones de llamada tipo de ayuda.

también

  • cuando findLargeImage devuelve el resultblock suele haber corrido sin embargo, como su una devolución de llamada. Tan grandeImagen no será válido todavía.
  • largeImage debe ser una variable de instancia que no tenga el alcance del método .

Utilizo este constructo para hacer esto cuando uso el método, pero puede encontrar algo más adecuado para su uso.

[node.view findLargeImage]; 
UIImage *thumb = node.view.largeImage; 
if (thumb) { blah blah } 

Eso es lo que aprendí al intentar hacer que esto funcionara de todos modos.

iOS 5 de actualización

Cuando se dispara el bloque resultado parece ser un poco más lento con IOS5 & dispositivos de núcleo tal vez solo por lo que no podía confiar en que la imagen sea directamente después de llamar findLargeImage. Así que lo cambié para llamar a un delegado.

@protocol HiresImageDelegate <NSObject> 
@optional 
-(void)hiresImageAvailable:(UIImage *)aimage; 
@end 

y comme ça

// 
    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) 
    { 
     ALAssetRepresentation *rep = [myasset defaultRepresentation]; 
     CGImageRef iref = [rep fullResolutionImage]; 
     if (iref) { 
      UIImage *largeimage = [UIImage imageWithCGImage:iref]; 
      [delegate hiresImageAvailable:large]; 
     } 
    }; 
+0

Hola, sé que esta es una vieja pregunta pero espero que alguien lo sepa. En este ejemplo, solo se está configurando una sola imagen. Tengo varias imágenes en ALAsset y necesito configurar cada una en UIImageView.Por ejemplo, algo como: largeimage1 = [UIImage imageWithCGImage: iref]; largeimage2 = [UIImage imageWithCGImage: iref]; largeimage3 = [UIImagemageWithCGImage: iref]; .... etc. – mreynol

+0

Lo usé para mostrar imágenes en la vista de tabla. Pero hace que la vista de tabla de desplazamiento sea lenta y entrecortada. El desplazamiento se detiene por un tiempo antes de rehacer la celda. Intenté hacerlo en el hilo de fondo, pero eso no se ve bien. Por favor ayuda. –

15

de respuesta Warren funcionó bien para mí. Una cosa útil para algunas personas es incluir la orientación de la imagen y los metadatos de la escala al mismo tiempo. Esto se realiza en el bloque resultado de este modo:

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) 
{ 
    ALAssetRepresentation *rep = [myasset defaultRepresentation]; 
    CGImageRef iref = [rep fullResolutionImage]; 
    if (iref) 
    { 
     UIImage *largeimage = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:[rep orientation]]; 
     [delegate hiresImageAvailable:large]; 
    } 
}; 

La llamada imageWIthCGImage en ese caso tiene escala y orientation añadido cuando se crea un UIImage para usted.

[UIImage imageWithCGImage:iref scale:[rep scale] orientation:[rep orientation]]; 

Un truco para tener en cuenta es que si se utiliza [rep fullScreenImage] en lugar de [rep fullResolutionImage] en iOS 5 se obtiene una imagen que ya se gira - sin embargo, es en la resolución de la pantalla del iPhone - es decir, su menor resolución.

9

Sólo para combinar las respuestas de Warren y de oknox en un fragmento más corto:

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; 
[assetsLibrary assetForURL:self.selectedPhotos[i] resultBlock: ^(ALAsset *asset){ 
    ALAssetRepresentation *representation = [asset defaultRepresentation]; 
    CGImageRef imageRef = [representation fullResolutionImage]; 
    if (imageRef) { 
     UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
     imageView.image = [UIImage imageWithCGImage:imageRef scale:representation.scale orientation:representation.orientation]; 
     // ... 
    } 
} failureBlock: ^{ 
    // Handle failure. 
}]; 

yo personalmente como el establecimiento de mi failureBlock a nil.

8
 NSURL* aURL = [NSURL URLWithString:@"URL here"]; 

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library assetForURL:aURL resultBlock:^(ALAsset *asset) 
    { 
    UIImage *copyOfOriginalImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage] scale:0.5 orientation:UIImageOrientationUp]; 

    cell.backgroundView = [[UIImageView alloc] initWithImage:copyOfOriginalImage]; 
    } 
    failureBlock:^(NSError *error) 
    { 
    // error handling 
    NSLog(@"failure-----"); 
    }]; 

acaba de proporcionar la UIReferenceURl tienes para la imagen en PhotoLibrary proporcionada anteriormente ... es sólo funciona bien. . .I diplayed en

  • celular UIcollectionView

    ..si sólo quiero mostrarlo en un

  • UIImageView

    significa

Cambio

cell.backgroundView = [[UIImageView alloc] initWithImage:copyOfOriginalImage]; 

Para

imageView.image = copyOfOriginalImage; 
Cuestiones relacionadas