2010-12-16 31 views
43

ja ratuję scalony obraz do biblioteki zdjęć za pomocą iPhone:iPhone: Jak uzyskać ścieżkę do pliku obrazu zapisanego za pomocą UIImageWriteToSavedPhotosAlbum()?

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

i uzyskanie zwrotnego używając:

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

Co chciałbym dostać to ścieżka do gdzie obraz ma został zapisany, więc mogę dodać go do tablicy, która będzie używana do wywoływania listy zapisanych pozycji w innym miejscu w aplikacji.

Po załadowaniu obrazu za pomocą selektora wyświetla on informację o ścieżce. Jednak po zapisaniu utworzonego obrazu nie mogę znaleźć miejsca, w którym można pobrać zapisaną ścieżkę obrazu.

Mam wyszukiwanie w sieci, ale większość przykładów zatrzymuje się przy wywołaniu zwrotnym z ładną wiadomością, aby powiedzieć, że obraz został zapisany pomyślnie. Chciałbym tylko wiedzieć, gdzie został zapisany.

Rozumiem, że jedną z metod może być rozpoczęcie definiowania własnych ścieżek, ale ponieważ metoda to robi dla mnie, miałem tylko nadzieję, że może mi powiedzieć, gdzie zapisano.

Odpowiedz

85

W końcu znalazłem odpowiedź. Wygląda na to, że metody UIImage usuwają metadane i używanie UIImageWriteToSavedPhotosAlbum nie jest dobre.

Jednak w ios4 Apple wprowadził nowy framework do obsługi biblioteki zdjęć o nazwie ALAssets Library.

Najpierw należy kliknąć prawym przyciskiem myszy na cele, a w części konstrukcyjnej dodać AlAsset Framework do projektu za pomocą małej ikony + w lewym dolnym rogu.

Następnie dodaj #import "AssetsLibrary/AssetsLibrary.h"; do pliku nagłówkowego swojej klasy.

Wreszcie można użyć następującego kodu:

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

I że uzyskuje ścieżkę pliku, który właśnie zapisany.

+0

Nice! dzięki za udostępnienie. –

+0

Jak załadować ten obraz? Czy mogę załadować galerię obrazów? czy ktoś może opublikować kod, aby to załadować? –

+7

Biblioteka ALAssetsLibrary jest uznawana za przestarzałą w systemie iOS 9.0+. Zamiast tego użyj PHPhotoLibrary i metody "performChanges", aby zapisać obrazy na urządzeniu. – Tys

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

Wdrażam ten kod na własną aplikację i działa. Możesz zmodyfikować swój własny kod, aby to zaimplementować. Mam nadzieję, że ci to pomoże. – sandy

3

Mój kod jest

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

w Bibliotece .h importu i określić typ DEF ALAssetsLibraryWriteImageCompletionBlock

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

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

jeśli nie wiem jak dostać <AssetsLibrary/AssetsLibrary.h>, należy dodać istniejących ram (AssetsLibrary.framework)

1

Wersja Swift będzie

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

I "zaimportuj ALAssets Library" do pliku.

Project-> Budowa Fazy -> binarny Link -> AssetsLibrary.framework

+0

czy możesz zaktualizować dla Swift 2.0? –

0

ALAssetsLibrary została zaniechana.

ten sposób należy to zrobić:

#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); 
    } 
}]; 
Powiązane problemy