Сохраните изображение в папку документов приложения из UIView на IOS
у меня есть UIImageView, который позволяет пользователю размещать и удерживать изображение, пока оно не будет сохранено. Проблема в том, что я не могу понять, как на самом деле сохранить и получить изображение, которое я разместил в представлении.
я извлек и поместил изображение в UIImageView следующим образом:
//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];
}
он отображает выбранное изображение в моем UIImageView просто отлично, но я понятия не имею, как его сохранить. Я сохраняю все остальные части представления (в основном UITextfield) в основных данных. Я искал и искал, и пробовал много битов кода, которые люди предложили, но либо я не ввожу код правильно, либо эти предложения не работают с тем, как я настроил свой код. Скорее всего, первое. Я хотел бы сохранить изображение в UIImageView, используя то же действие (кнопка сохранения), которое я использую для сохранения текста в полях UITextFields. Вот как я сохраняю свою информацию UITextField:
// Handle Save Button
- (void)save {
// Get Info From UI
[self.referringObject setValue:self.myInfo.text forKey:@"myInfo"];
Как я уже говорил ранее, я пробовал несколько методов, чтобы получить эту работу, но не могу ухватиться за это. Впервые в жизни мне захотелось причинить физический вред неодушевленному предмету, но я сумел сдержаться.
Я хотел бы иметь возможность сохранить изображение, которое пользователь помещает в UIImageView в папке документов приложения, а затем иметь возможность получить его и поместить в другой UIImageView для отображения, когда пользователь нажимает это представление в стек. Любая помощь очень ценится!
5 ответов:
все хорошо, чувак. Не причиняйте вреда ни себе, ни другим.
вы, вероятно, не хотите хранить эти изображения в основных данных, так как это может повлиять на производительность, если набор данных становится слишком большим. Лучше записывать изображения в файлы.
NSData *pngData = UIImagePNGRepresentation(image);
это вытаскивает данные PNG изображения, которое вы захватили. Отсюда вы можете записать его в файл:
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
чтение его позже работает таким же образом. Построить путь, как мы только что сделали выше, затем:
NSData *pngData = [NSData dataWithContentsOfFile:filePath]; UIImage *image = [UIImage imageWithData:pngData];
то, что вы, вероятно, хотите сделать, это сделать метод, который создает строки пути для вас, так как вы не хотите, чтобы этот код был замусорен везде. Это может выглядеть так:
- (NSString *)documentsPathForFileName:(NSString *)name { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsPath = [paths objectAtIndex:0]; return [documentsPath stringByAppendingPathComponent:name]; }
надеюсь, что это полезно.
версия Swift 3.0
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) }
В 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 } }
Это ответ Фанмин Ниндля Swift 3/4, обновляются с рекомендуется и более быстрый метод для получения пути к каталогу документов и с лучшей документацией. Кредиты на Fangming Нинг для нового метода, а также.
guard let documentDirectoryPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } //Using force unwrapping here because we're sure "1.jpg" exists. Remember, this is just an example. let img = UIImage(named: "1.jpg")! // Change extension if you want to save as PNG. let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("1.jpg").absoluteString) do { //Use UIImagePNGRepresentation if you want to save as PNG. //.atomic is just an example here, check out other writing options as well. (see the link under this example) //(atomic writes data to a temporary file first and sending that file to its final destination) try UIImageJPEGRepresentation(img, 1)?.write(to: imgPath, options: .atomic) } catch { print(error.localizedDescription) }
Swift 4 с расширением
extension UIImage{ func saveImage(inDir:FileManager.SearchPathDirectory,name:String){ guard let documentDirectoryPath = FileManager.default.urls(for: inDir, in: .userDomainMask).first else { return } let img = UIImage(named: "\(name).jpg")! // Change extension if you want to save as PNG. let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("\(name).jpg").absoluteString) do { try UIImageJPEGRepresentation(img, 0.5)?.write(to: imgPath, options: .atomic) } catch { print(error.localizedDescription) } } }
пример использования
image.saveImage(inDir: .documentDirectory, name: "pic")