Как сохранить и прочитать изображение в моей временной папке при выходе и загрузке моего приложения

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


person Jab    schedule 20.12.2009    source источник


Ответы (6)


Эти методы позволяют сохранять и извлекать изображение из каталога документов на iPhone.

+ (void)saveImage:(UIImage *)image withName:(NSString *)name {
    NSData *data = UIImageJPEGRepresentation(image, 1.0);
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name];
    [fileManager createFileAtPath:fullPath contents:data attributes:nil];
}

+ (UIImage *)loadImage:(NSString *)name {
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name];    
    UIImage *img = [UIImage imageWithContentsOfFile:fullPath];

    return img;
}
person ennuikiller    schedule 20.12.2009
comment
Спасибо за быстрое время ответа. И точный ответ. - person Jab; 20.12.2009
comment
И откуда берется DocumentDirectory? - person jjxtra; 22.04.2012
comment
Подробная информация о каталоге документов здесь stackoverflow.com/questions/6907381/ - person Chris O'Sullivan; 22.04.2013

Swift 3 xCode 8.2

Получение справочника документов:

func getDocumentDirectoryPath() -> NSString {
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let documentsDirectory = paths[0]
    return documentsDirectory as NSString
}

Сохранение:

func saveImageToDocumentsDirectory(image: UIImage, withName: String) -> String? {
    if let data = UIImagePNGRepresentation(image) {
        let dirPath = getDocumentDirectoryPath()
        let imageFileUrl = URL(fileURLWithPath: dirPath.appendingPathComponent(withName) as String)
        do {
            try data.write(to: imageFileUrl)
            print("Successfully saved image at path: \(imageFileUrl)")
            return imageFileUrl.absoluteString
        } catch {
            print("Error saving image: \(error)")
        }
    }
    return nil
}

Загрузка:

func loadImageFromDocumentsDirectory(imageName: String) -> UIImage? {
    let tempDirPath = getDocumentDirectoryPath()
    let imageFilePath = tempDirPath.appendingPathComponent(imageName)
    return UIImage(contentsOfFile:imageFilePath)
}

Пример:

//TODO: pass your image to the actual method call here:
let pathToSavedImage = saveImageToDocumentsDirectory(image: imageToSave, withName: "imageName.png")
if (pathToSavedImage == nil) {
    print("Failed to save image")
}

let image = loadImageFromDocumentsDirectory(imageName: "imageName.png")
if image == nil {
    print ("Failed to load image")
}
person Anton    schedule 22.02.2017

Кроме того, вы никогда не захотите сохранять что-либо в фактическом каталоге tmp после закрытия приложения. Каталог tmp может быть очищен системой. По определению он существует исключительно для хранения второстепенных файлов, необходимых только во время работы приложения.

Файлы, которые вы хотите сохранить, всегда должны находиться в каталоге documents.

person TechZen    schedule 20.12.2009

Реализация Swift 4:

// saves an image, if save is successful, returns its URL on local storage, otherwise returns nil
func saveImage(_ image: UIImage, name: String) -> URL? {
    guard let imageData = UIImageJPEGRepresentation(image, 1) else {
        return nil
    }
    do {
        let imageURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(name)
        try imageData.write(to: imageURL)
        return imageURL
    } catch {
        return nil
    }
}

// returns an image if there is one with the given name, otherwise returns nil
func loadImage(withName name: String) -> UIImage? {
    let imageURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(name)
    return UIImage(contentsOfFile: imageURL.path)
}

Пример использования (при условии, что у нас есть изображение):

let image = UIImage(named: "milan")

let url = saveImage(image, name: "savedMilan.jpg")
print(">>> URL of saved image: \(url)")

let reloadedImage = loadImage(withName: "savedMilan.jpg")
print(">>> Reloaded image: \(reloadedImage)")
person Milan Nosáľ    schedule 14.02.2018
comment
UIImageJPEGRepresentation(image, 1) изменен на image.jpegData(compressionQuality: 1) - person 7RedBits.com; 14.05.2020

Протестированный код для swift

//to get document directory path
    func getDocumentDirectoryPath() -> NSString {
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        let documentsDirectory = paths[0]
        return documentsDirectory
    }

Позвонить с помощью

if let data = UIImagePNGRepresentation(img) {
     let filename = self.getDocumentDirectoryPath().stringByAppendingPathComponent("resizeImage.png")
     data.writeToFile(filename, atomically: true)
}
person Hardik Thakkar    schedule 28.06.2016

Непроверенная настройка Swift для выбранного ответа:

class func saveImage(image: UIImage, withName name: String) {
    let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String
    var data: NSData = UIImageJPEGRepresentation(image, 1.0)!
    var fileManager: NSFileManager = NSFileManager.defaultManager()

    let fullPath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(name)
    fileManager.createFileAtPath(fullPath.absoluteString, contents: data, attributes: nil)
}

class func loadImage(name: String) -> UIImage {
    var fullPath: String = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(name).absoluteString
    var img:UIImage = UIImage(contentsOfFile: fullPath)!
    return img
}
person Mohammad Zaid Pathan    schedule 04.02.2016