ver transferir puedo pasar las importar fotos con iphone image url

transferir - mostrar imagen de URL recuperada de ALAsset en iPhone



pasar fotos de iphone a pc windows 7 (4)

Estoy usando un ALAsset Framework para acceder a los archivos en la galería de fotos del dispositivo.

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é usar el campo 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 colocarla 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; }


La API ha cambiado ligeramente las reglas y ya no tienes acceso directo al sistema de archivos a la biblioteca de iPhoto. En cambio, obtienes URL de biblioteca de recursos como esta.

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

Utiliza el objeto ALAssetLibrary para acceder al objeto ALAsset a través de la URL.

así que desde los documentos para ALAssetLibrary arroja esto en un encabezado (o tu fuente)

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

que no es estrictamente necesario, pero mantiene las cosas bonitas.
y luego en tu 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 es que esto utiliza bloques que eran nuevos para mí antes de que comenzara mi portar iOS4, pero es posible que desee mirar

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 la cabeza un poco, pero si los consideras como selectores de notificaciones o devoluciones de llamadas, es algo que ayuda.

también

  • cuando findLargeImage devuelve el resultblock no se habrá ejecutado todavía ya que es una devolución de llamada. Así que la imagen grande no será válida todavía.
  • largeImage necesita 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í mientras trataba de hacer que esto funcionara de todos modos.

Actualización de iOS 5

Cuando los incendios del bloque de resultados parecen ser un poco más lentos con iOS5 y tal vez con dispositivos de núcleo único, no podía confiar en que la imagen estuviera disponible directamente después de llamar a findLargeImage . Así que lo cambié para llamar a un delegado.

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

y comme cá

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


La respuesta de 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 lo haces en tu bloque de resultados así:

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 a imageWIthCGImage en ese caso tiene escala y orientation agregadas cuando crea un UIImage para usted.

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

Un truco para señalar es que si usa [rep fullScreenImage] lugar de [rep fullResolutionImage] en iOS 5, obtiene una imagen que ya está rotada, pero está en la resolución de la pantalla del iPhone, es decir, tiene una resolución más baja.


Solo para combinar las respuestas de Warren y 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. }];

Personalmente me gusta configurar mi failureBlock a nil .


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

solo proporcione la UIReferenceURL que obtuvo para la imagen en la fototeca proporcionada anteriormente ... simplemente funciona bien. . . Lo reflejé en

  • UIcollectionView cell

    ..si solo quieres mostrarlo en una

  • UIImageView

    medio

Cambio

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

A

imageView.image = copyOfOriginalImage;