iPhone: ¿Cómo obtengo la ruta de archivo de una imagen guardada con UIImageWriteToSavedPhotosAlbum()?
ios photolibrary (6)
ALAssetsLibrary ha quedado en desuso.
Esta es la forma en que debes hacerlo:
#import <Photos/Photos.h>
UIImage *yourImage;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
[PHAssetChangeRequest creationRequestForAssetFromImage:yourImage];
} completionHandler:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"Success");
} else {
NSLog(@"write error : %@",error);
}
}];
Estoy guardando una imagen fusionada en la biblioteca de fotos de iPhone usando:
UIImageWriteToSavedPhotosAlbum(viewImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), nil);
Y obteniendo la devolución de llamada usando:
- (void) savedPhotoImage:(UIImage*)image didFinishSavingWithError:(NSError *)error contextInfo: (void *)contextInfo { NSLog(@"%@", [error localizedDescription]);
NSLog(@"info: %@", contextInfo);}
Lo que me gustaría obtener es la ruta de donde se ha guardado la imagen, así que puedo agregarla a una matriz que se usará para abrir una lista de elementos guardados en otra parte de la aplicación.
Cuando cargo la imagen usando el selector, muestra la información de ruta. Sin embargo, cuando guardo una imagen creada, no puedo encontrar dónde tirar la ruta de la imagen guardada.
Tengo búsqueda sobre la web, pero la mayoría de los ejemplos se detienen en la devolución de llamada con un bonito mensaje para decir que la imagen se guardó con éxito. Me gustaría poder saber dónde se guardó.
Entiendo que un método podría ser comenzar a definir mis propios caminos, pero como el método lo hace por mí, esperaba que me diga dónde se guardó.
Finalmente descubrí la respuesta. Aparentemente, los métodos UIImage eliminan los metadatos y, por lo tanto, no es bueno usar UIImageWriteToSavedPhotosAlbum.
Sin embargo, en ios4 Apple puso un nuevo marco para manejar la biblioteca de fotos llamada ALAssetsLibrary.
Primero debe hacer clic con el botón derecho en los Objetivos y en la parte de compilación, agregue AlAsset Framework a su proyecto con el pequeño icono + en la parte inferior izquierda.
A continuación, agregue #import "AssetsLibrary/AssetsLibrary.h";
al archivo de encabezado de tu clase.
Finalmente puedes usar el siguiente código:
UIImage *viewImage = YOUR UIIMAGE // --- mine was made from drawing context
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
// Request to save the image to camera roll
[library writeImageToSavedPhotosAlbum:[viewImage CGImage] orientation:(ALAssetOrientation)[viewImage imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){
if (error) {
NSLog(@"error");
} else {
NSLog(@"url %@", assetURL);
}
}];
[library release];
Y eso obtiene la ruta del archivo que acaba de guardar.
La versión de Swift será
ALAssetsLibrary().writeImageToSavedPhotosAlbum(editedImage.CGImage, orientation: ALAssetOrientation(rawValue: editedImage.imageOrientation.rawValue)!,
completionBlock:{ (path:NSURL!, error:NSError!) -> Void in
print("/(path)")
})
Y "importar ALAssetsLibrary" en su archivo.
Proyecto-> Fases de compilación -> Enlace binario -> AssetsLibrary.framework
Mi código es
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
imageURL = nil;
ALAssetsLibraryWriteImageCompletionBlock completeBlock = ^(NSURL *assetURL, NSError *error){
if (!error) {
#pragma mark get image url from camera capture.
imageURL = [NSString stringWithFormat:@"%@",assetURL];
}
};
if(image){
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageToSavedPhotosAlbum:[image CGImage]
orientation:(ALAssetOrientation)[image imageOrientation]
completionBlock:completeBlock];
}
}
in .h Importar biblioteca y definir tipo def de ALAssetsLibraryWriteImageCompletionBlock
#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>
typedef void (^ALAssetsLibraryWriteImageCompletionBlock)(NSURL *assetURL, NSError *error);
si no sabe cómo obtener <AssetsLibrary/AssetsLibrary.h>
, agregue el marco existente (AssetsLibrary.framework)
Swift 4.1 versión de la respuesta de OlivaresF
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAsset(from: image)
}) { (success, error) in
if success {
} else {
}
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
RandomIndexnew = arc4random() % 3;
if(RandomIndexnew == 0)
{
nameStr =[NSString stringWithFormat:@"jpg"];
textFieldNormalFile_type.text =[NSString stringWithFormat:@"jpg"];
}
else if(RandomIndexnew = 1)
{
nameStr =[NSString stringWithFormat:@"gif"];
textFieldNormalFile_type.text =[NSString stringWithFormat:@"GIF"];
}
else if(RandomIndexnew = 2)
{
nameStr =[NSString stringWithFormat:@"jpg"];
textFieldNormalFile_type.text =[NSString stringWithFormat:@"JPG"];
}
RandomIndex = arc4random() % 20;
NSString *nameStr1 =[NSString stringWithFormat:@"Image%i",RandomIndex];
textFieldNormalFile_name.text =[NSString stringWithFormat:@"%@.%@",nameStr1,nameStr];
newFilePath = [NSHomeDirectory() stringByAppendingPathComponent: textFieldNormalFile_name.text];
imageData = UIImageJPEGRepresentation(img, 1.0);
if (imageData != nil) {
NSLog(@"HERE [%@]", newFilePath);
[imageData writeToFile:newFilePath atomically:YES];
}
image.image =[UIImage imageNamed:newFilePath];
NSLog(@"newFilePath:%@",newFilePath);
path.text =[NSString stringWithFormat:newFilePath];
NSLog(@"path.text :%@",path.text);
}