2011-07-25 50 views
102

Mam UIImageView, który pozwala użytkownikowi umieścić i przytrzymać obraz, dopóki nie zostanie zapisany. Problem polega na tym, że nie mogę wymyślić, jak faktycznie zapisać i pobrać obraz, który umieściłem w widoku.Zapisywanie obrazu w folderze dokumentów aplikacji Od UIView Na IOS

I pobraniu i umieścił obraz w UIImageView tak:

//Get Image 
- (void) getPicture:(id)sender { 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.delegate = self; 
    picker.allowsEditing = YES; 
    picker.sourceType = (sender == myPic) ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
    [self presentModalViewController:picker animated:YES]; 
    [picker release]; 
} 


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage (UIImage *)image editingInfo:(NSDictionary *)editingInfo { 
    myPic.image = image; 
    [picker dismissModalViewControllerAnimated:YES]; 
} 

Wyświetla wybrany obraz w moim UIImageView dobrze, ale nie mam pojęcia jak go uratować. Zapisuję wszystkie inne elementy widoku (głównie UITextfield) w danych podstawowych. Szukałem i przeszukałem, próbowałem wielu fragmentów kodu, które ludzie sugerowali, ale albo nie wpisuję poprawnie kodu, albo te sugestie nie działają ze sposobem, w jaki mam ustawiony mój kod. To najprawdopodobniej ta pierwsza. Chciałbym zapisać obraz w UIImageView przy użyciu tej samej akcji (przycisk zapisu), którego używam do zapisania tekstu w UITextFields. Oto jak ja ratuję mój UITextField informacje:

// Handle Save Button 
- (void)save { 

    // Get Info From UI 
    [self.referringObject setValue:self.myInfo.text forKey:@"myInfo"]; 

Tak jak mówiłem wcześniej, próbowałem kilka sposobów, aby uzyskać to do pracy, ale nie może uzyskać zrozumienie na nim. Po raz pierwszy w życiu chciałem wyrządzić szkodę fizyczną obiektowi nieożywionym, ale udało mi się powstrzymać.

Chciałbym móc zapisać obraz użytkownika umieszczany w UIImageView w folderze dokumentów aplikacji, a następnie być w stanie go pobrać i umieścić go w innym UIImageView do wyświetlania, gdy użytkownik popycha ten widok na stos. Każda pomoc jest bardzo cenna!

Odpowiedz

323

Wszystko dobrze, stary. Nie krzywdź siebie ani innych.

Prawdopodobnie nie chcesz przechowywać tych obrazów w danych podstawowych, ponieważ może to mieć wpływ na wydajność, jeśli zestaw danych będzie zbyt duży. Lepiej pisać obrazy do plików.

NSData *pngData = UIImagePNGRepresentation(image); 

Powoduje pobranie danych PNG z przechwyconego obrazu. Stąd możesz zapisać go do pliku:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory 
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; //Add the file name 
[pngData writeToFile:filePath atomically:YES]; //Write the file 

Czytanie go później działa w ten sam sposób. Zbudować ścieżkę jak właśnie zrobiłem powyżej, a następnie:

NSData *pngData = [NSData dataWithContentsOfFile:filePath]; 
UIImage *image = [UIImage imageWithData:pngData]; 

Co prawdopodobnie będziesz chciał zrobić, to sposób, który tworzy ciągi ścieżek dla Ciebie, ponieważ nie chcesz tego kodu zaśmiecona wszędzie. Może wyglądać tak:

- (NSString *)documentsPathForFileName:(NSString *)name 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    NSString *documentsPath = [paths objectAtIndex:0]; 

    return [documentsPath stringByAppendingPathComponent:name]; 
} 

Mam nadzieję, że to pomocne.

+2

całkowicie poprawne - po prostu chcę wspomnieć przechowywania wytyczne Apple, więc w zależności od rodzaju obrazach, to powinny być przechowywane w pamięci podręcznych –

+0

I postępował zgodnie z sugestią i kodem. ale nie pojawia się w sekcjach zdjęć. Jak to się stało? – NovusMobile

+0

@DaniloCampos Jak utworzyć folder wewnątrz Katalogu dokumentów, a następnie zapisać plik w tym folderze? –

0

w Swift:

let paths: [NSString?] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .LocalDomainMask, true) 
if let path = paths[0]?.stringByAppendingPathComponent(imageName) { 
    do { 
     try UIImagePNGRepresentation(image)?.writeToFile(path, options: .DataWritingAtomic) 
    } catch { 
     return 
    } 
} 
2

Swift 3.0 wersja

let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString 

let img = UIImage(named: "1.jpg")!// Or use whatever way to get the UIImage object 
let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("1.jpg"))// Change extension if you want to save as PNG 

do{ 
    try UIImageJPEGRepresentation(img, 1.0)?.write(to: imgPath, options: .atomic)//Use UIImagePNGRepresentation if you want to save as PNG 
}catch let error{ 
    print(error.localizedDescription) 
} 
Powiązane problemy