2011-02-10 7 views
19

Mam aplikację na iPhone'a używając UIImagePickerController. Jak sourceType mamiPhone - UIImagePickerController -> zapisz obraz w folderze aplikacji

  • UIImagePickerControllerSourceTypePhotoLibrary
  • UIImagePickerControllerSourceTypeCamera
  • UIImagePickerControllerSourceTypeSavedPhotosAlbum

dzięki czemu użytkownik może wykonać zdjęcie lub wybrać jeden z biblioteki zdjęć ze zdjęć lub zdjęć z kamer.

Obraz zostanie wyświetlony w UIImageView. Obraz powinien zostać zapisany, jeśli użytkownik zamknie aplikację. Tak więc w przypadku pól tekstowych używam NSUserDefaults. Wiem, że nie jest to dobry sposób na zapisanie obrazu wewnątrz NSUSerDefaults za pomocą NSData, więc chcę zapisać/skopiować obraz do folderu kontrolowanego przez moją aplikację, podobnego do NSUserDefaults.

Jak mogę to zrobić? Chcę go zapisać, a następnie mogę zapisać ścieżkę do pliku na mój numer NSUserDefaults i przeczytać go podczas uruchamiania aplikacji.

Z góry dziękuję & Pozdrawiamy.

Odpowiedz

47

Można użyć następującego kodu w UIImagePickerControllerDelegate powierzenie wykonania

- (void) imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info { 

    //obtaining saving path 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"latest_photo.png"]; 

    //extracting image from the picker and saving it 
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
    if ([mediaType isEqualToString:@"public.image"]){ 
     UIImage *editedImage = [info objectForKey:UIImagePickerControllerEditedImage]; 
     NSData *webData = UIImagePNGRepresentation(editedImage); 
     [webData writeToFile:imagePath atomically:YES]; 
    } 
} 

to wszystkie

+3

Musiałem użyć [info objectForKey: UIImagePickerControllerOriginalImage]; zamiast UIImagePickerControllerEditedImage –

+0

Dokładnie, to zależy od tego, czy możesz edytować, czy nie, picker.allowsEditing = YES; – khunshan

+0

Zakłada to, że obraz jest png (lub przynajmniej lekceważący zapis obrazu jako png). – Andy

8

W zależności od formatu pliku, który chcesz zapisać, można użyć

[UIImagePNGRepresentation(image) writeToFile:path atomically:YES]; 

LUB

[UIImageJPEGRepresentation(image) writeToFile:path atomically:YES]; 
3

To jest kod do zapisania UIImage w katalogu dokumentów. Można użyć tego kodu w metodzie delegata didFinishPickingImage:

// Create paths to output images 
NSString *pngPath = [NSHomeDirectory(); 
stringByAppendingPathComponent:@"Documents/Test.png"]; 
NSString *jpgPath = [NSHomeDirectory(); 
stringByAppendingPathComponent:@"Documents/Test.jpg"]; 

// Write a UIImage to JPEG with minimum compression (best quality) 
// The value 'image' must be a UIImage object 
// The value '1.0' represents image compression quality as value from 0.0 to 1.0 
[UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES]; 

// Write image to PNG 
[UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES]; 

// Let's check to see if files were successfully written... 

// Create file manager 
NSError *error; 
NSFileManager *fileMgr = [NSFileManager defaultManager]; 

// Point to Document directory 
NSString *documentsDirectory = [NSHomeDirectory(); 
stringByAppendingPathComponent:@"Documents"]; 

// Write out the contents of home directory to console 
NSLog(@"Documents directory: %@", [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error]); 

EDIT

Można również użyć:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

znaleźć ścieżkę do katalogu dokumentów aplikacja, zamiast NSHomeDierctory. Odpowiedź

+0

dzięki! działa świetnie! –

+0

@ iHS Mam wymagania pobierania obrazów z aplikacji i zapisywania ich w aplikacji. Czy mogę używać tego samego kodu do zapisywania obrazów? – arshad

1

Aktualizacja knuku dla Swift 3.0

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    //obtaining saving path 
    let fileManager = FileManager.default 
    let documentsPath = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first 
    let imagePath = documentsPath?.appendingPathComponent("image.jpg") 

    // extract image from the picker and save it 
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     try! UIImageJPEGRepresentation(pickedImage, 0.0)?.write(to: imagePath!) 
    } 
    self.dismiss(animated: true, completion: nil)   
} 

tutaj obraz zostanie zapisany jako JPEG, ale można również zapisać go jako PNG. parametr 0.0 oznacza kompresję i jest to najniższa jakość, jeśli chcesz uzyskać najlepsze wykorzystanie 1.0.