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