iPhone - UIImagePickerController - ›сохранить изображение в папку приложения

У меня есть приложение для iPhone, использующее UIImagePickerController. Как sourceType у меня

  • UIImagePickerControllerSourceTypePhotoLibrary
  • UIImagePickerControllerSourceTypeCamera
  • UIImagePickerControllerSourceTypeSavedPhotosAlbum

так что пользователь может сделать фотографию или выбрать одну из фото-библиотеки из фотографий или фотографий с камеры.

Изображение будет отображаться в UIImageView. Изображение должно быть сохранено, если пользователь закроет приложение. Поэтому для текстовых полей я использую NSUserDefaults. Я знаю, что это не лучший способ сохранить изображение внутри NSUSerDefaults с помощью NSData, поэтому я хочу сохранить / скопировать изображение в папку, которая контролируется моим приложением, аналогичным NSUserDefaults.

Как я могу это сделать? Я хочу сохранить его, а затем я могу записать путь к файлу в свой NSUserDefaults и прочитать его при запуске приложения.

Заранее спасибо и С наилучшими пожеланиями.


person Tim    schedule 10.02.2011    source источник


Ответы (4)


Вы можете использовать следующий код в реализации UIImagePickerControllerDelegate делегата

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

UPD

Код Swift 3.0 от XueYu

здесь изображение сохраняется как jpeg, но вы также можете сохранить его как png. Параметр 0.0 означает сжатие, и это самое низкое качество, если вы хотите использовать 1.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)        
}
person knuku    schedule 10.02.2011
comment
Мне пришлось использовать [info objectForKey: UIImagePickerControllerOriginalImage]; вместо UIImagePickerControllerEditedImage - person Brody Robertson; 27.11.2013
comment
Точно, это зависит от того, разрешили вы редактирование или нет, picker.allowsEditing = YES; - person khunshan; 18.03.2014
comment
Это предполагает, что изображение является png (или, по крайней мере, неуважительно при сохранении изображения в формате png). - person Andy; 29.04.2017

В зависимости от формата файла, который вы хотите сохранить, вы можете использовать

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

OR

[UIImageJPEGRepresentation(image) writeToFile:path atomically:YES];
person Björn Marschollek    schedule 10.02.2011

Это код для сохранения UIImage в каталог документов. Вы можете использовать этот код в методе делегата 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]);

РЕДАКТИРОВАТЬ

Вы также можете использовать:

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

чтобы найти путь к каталогу документов вашего приложения вместо NSHomeDierctory.

person iHS    schedule 10.02.2011
comment
@iHS у меня есть требование извлекать изображения из API и сохранять их в приложении .. могу ли я использовать тот же код для сохранения изображений ?? - person arshad; 13.01.2014

Обновите ответ knuku для 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)        
}

здесь изображение сохраняется как jpeg, но вы также можете сохранить его как png. Параметр 0.0 означает сжатие, и это самое низкое качество, если вы хотите использовать 1.0 наилучшим образом.

person XueYu    schedule 17.04.2017