// 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.
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
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
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