wake-up-neo.com

iPhone: Wie bekomme ich den Dateipfad eines mit UIImageWriteToSavedPhotosAlbum () gespeicherten Bildes?

Ich speichere ein zusammengeführtes Bild in der iPhone-Fotobibliothek mit:

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

Und den Rückruf erhalten mit:

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

Was ich gerne erhalten würde, ist der Pfad, an dem das Bild gespeichert wurde, sodass ich es zu einem Array hinzufügen kann, mit dem eine Liste der gespeicherten Elemente an anderer Stelle in der App aufgerufen wird.

Wenn ich das Bild mit dem Picker lade, wird die Pfadinfo ... angezeigt. Wenn ich jedoch ein erstelltes Bild speichere, kann ich nicht finden, wohin der gespeicherte Bildpfad gezogen werden soll.

Ich habe über das Web gesucht, aber die meisten Beispiele halten beim Rückruf mit der Nachricht "Nice" an, um zu sagen, dass das Bild erfolgreich gespeichert wurde .. Ich möchte nur wissen können, wo es gespeichert wurde.

Ich verstehe, dass es eine Methode sein könnte, meine eigenen Pfade zu definieren, aber da die Methode das für mich tut, hoffte ich nur, dass sie mir sagen könnte, wo sie gespeichert wurde.

46
Ben

Ich fand schließlich die Antwort heraus . Anscheinend entfernen die UIImage-Methoden Metadaten, und daher ist die Verwendung von UIImageWriteToSavedPhotosAlbum nicht gut.

In ios4 hat Apple jedoch ein neues Framework für die Fotobibliothek namens ALAssetsLibrary eingeführt.

Zuerst müssen Sie mit der rechten Maustaste auf die Ziele klicken und im Build-Teil das AlAsset Framework zu Ihrem Projekt hinzufügen, indem Sie das kleine + -Symbol unten links verwenden.

Fügen Sie dann #import "AssetsLibrary/AssetsLibrary.h"; zur Header-Datei Ihrer Klasse hinzu.

Schließlich können Sie den folgenden Code verwenden:

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

Und das liefert den Pfad der Datei, die Sie gerade gespeichert haben.

85
Ben

Mein Code lautet

-(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 import Library und definieren Sie den Typ def von ALAssetsLibraryWriteImageCompletionBlock

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

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

wenn Sie nicht wissen, wie Sie <AssetsLibrary/AssetsLibrary.h> bekommen, fügen Sie bitte das vorhandene Framework hinzu (AssetsLibrary.framework).

3

Schnelle Version 4.1 von OlivaresFs Antwort

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

                } else {
                }
            }
2

Swift Version wird sein

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

Und "ALAssetsLibrary importieren" in Ihre Datei. 

Projekt -> Phasen erstellen -> Binär verknüpfen -> AssetsLibrary.framework

1
Avijit Nagare

ALAssetsLibrary ist veraltet.

So sollten Sie es tun:

#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

OlivariesFs Antwort fehlt der Schlüsselteil dieser Frage. Rufen Sie den Pfad ab:

Hier ist ein Code-Snippet, der alles macht:

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