IPhone - UIImagePickerController → сохранить изображение в папку приложения
У меня есть приложение iPhone с помощью UIImagePickerController
. Поскольку sourceType
, я
- UIImagePickerControllerSourceTypePhotoLibrary
- UIImagePickerControllerSourceTypeCamera
- UIImagePickerControllerSourceTypeSavedPhotosAlbum
чтобы пользователь мог сделать фотографию или выбрать ее из библиотеки фотографий из фотографий или фотографий камеры.
Изображение будет отображаться в UIImageView. Изображение должно быть сохранено, если пользователь закрывает приложение. Поэтому для текстовых полей я использую NSUserDefaults
. Я знаю, что это не лучший способ сохранить изображение внутри NSUSerDefaults с NSData, поэтому я хочу сохранить/скопировать изображение в папку, которая управляется моим приложением, аналогичным NSUserDefaults.
Как я могу это сделать? Я хочу сохранить его, а затем я могу написать путь к файлу в мой NSUserDefaults
и прочитать его при запуске приложения.
Спасибо заранее и с наилучшими пожеланиями.
Ответы
Ответ 1
Вы можете использовать следующий код в реализации 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];
}
}
Что все
Ответ 2
В зависимости от формата файла, который вы хотите сохранить, вы можете использовать
[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];
ИЛИ
[UIImageJPEGRepresentation(image) writeToFile:path atomically:YES];
Ответ 3
Это код для сохранения 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 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.
Ответ 4
Обновить ответ 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.