Сохраните изображение в папку документов приложения из 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 104

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")