web-dev-qa-db-fra.com

iPhone: Comment obtenir le chemin du fichier d'une image enregistrée avec UIImageWriteToSavedPhotosAlbum ()?

Je sauvegarde une image fusionnée dans la photothèque iPhone en utilisant:

UIImageWriteToSavedPhotosAlbum(viewImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), nil);

Et obtenir le rappel en utilisant:

- (void) savedPhotoImage:(UIImage*)image didFinishSavingWithError:(NSError *)error contextInfo: (void *)contextInfo { NSLog(@"%@", [error localizedDescription]);
NSLog(@"info: %@", contextInfo);}

Ce que j'aimerais obtenir, c'est le chemin d'accès à l'endroit où l'image a été enregistrée. Je peux donc l'ajouter à un tableau qui sera utilisé pour appeler une liste d'éléments enregistrés ailleurs dans l'application.

Lorsque je charge l'image à l'aide du sélecteur, il affiche les informations relatives au chemin d'accès. Cependant, lorsque je sauvegarde une image créée, je ne trouve pas où extraire le chemin de l'image enregistrée.

J'ai une recherche sur le Web, mais la plupart des exemples s'arrêtent au rappel avec un message de Nice pour indiquer que l'image a été enregistrée avec succès .. Je voudrais simplement savoir où elle a été enregistrée.

Je comprends qu'une méthode peut être de commencer à définir mes propres chemins, mais comme cette méthode le fait pour moi, j'espérais juste qu'elle pourrait me dire où elle était sauvegardée.

46
Ben

J'ai finalement trouvé la réponse… .. Apparemment, les méthodes UIImage suppriment les métadonnées et donc, utiliser UIImageWriteToSavedPhotosAlbum n'est pas bon.

Cependant, dans ios4, Apple a mis en place un nouveau cadre pour gérer la photothèque appelée ALAssetsLibrary.

Vous devez d’abord faire un clic droit sur les cibles et dans la partie construction, ajouter le cadre AlAsset à votre projet avec la petite icône + en bas à gauche.

Ajoutez ensuite #import "AssetsLibrary/AssetsLibrary.h"; au fichier d’en-tête de votre classe.

Enfin, vous pouvez utiliser le code suivant:

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

Et cela obtient le chemin du fichier que vous venez de sauvegarder.

85
Ben

Mon code est

-(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];
    }
}

dans la bibliothèque d'importation .h et définissez le type def de ALAssetsLibraryWriteImageCompletionBlock

#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>

typedef void (^ALAssetsLibraryWriteImageCompletionBlock)(NSURL *assetURL, NSError *error);

si vous ne savez pas comment obtenir <AssetsLibrary/AssetsLibrary.h>, veuillez ajouter le framework existant (AssetsLibrary.framework)

3

Version Swift 4.1 de la réponse d'OlivaresF

        PHPhotoLibrary.shared().performChanges({
                PHAssetChangeRequest.creationRequestForAsset(from: image)
            }) { (success, error) in
                if success {

                } else {
                }
            }
2
Chris Van Buskirk

Swift Version sera

 ALAssetsLibrary().writeImageToSavedPhotosAlbum(editedImage.CGImage, orientation: ALAssetOrientation(rawValue: editedImage.imageOrientation.rawValue)!,
                completionBlock:{ (path:NSURL!, error:NSError!) -> Void in
                    print("\(path)")
            })

Et "importer ALAssetsLibrary" dans votre fichier. 

Projet-> Build Phases -> Link binary -> AssetsLibrary.framework

1
Avijit Nagare

ALAssetsLibrary est obsolète.

Voici comment vous devriez le faire:

#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);
    }
}];
0
OlivaresF
- (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);
}
0
sandy

La réponse d'OlivariesF manque la partie clé de cette question, récupérez le chemin:

Voici un extrait de code qui fait tout:

- (void)processImage:(UIImage*)image type:(NSString*)mimeType forCallbackId:(NSString*)callbackId
    {
        __block NSString* localId;

        // Add it to the photo library
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];

            localId = [[assetChangeRequest placeholderForCreatedAsset] localIdentifier];
        } completionHandler:^(BOOL success, NSError *err) {
            if (!success) {
                NSLog(@"Error saving image: %@", [err localizedDescription]);
            } else {
                PHFetchResult* assetResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[localId] options:nil];
                PHAsset *asset = [assetResult firstObject];
                [[PHImageManager defaultManager] requestImageDataForAsset:asset
                                                                  options:nil
                                                            resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
                    NSURL *fileUrl = [info objectForKey:@"PHImageFileURLKey"];
                    if (fileUrl) {
                        NSLog(@"Image path: %@", [fileUrl relativePath]);
                    } else {
                        NSLog(@"Error retrieving image filePath, heres whats available: %@", info);
                    }
                }];
            }
        }];
    }
0
user1495323