Как сохранить и прочитать изображение во временную папку при выходе и загрузке приложения - PullRequest
8 голосов
/ 20 декабря 2009

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

Ответы [ 6 ]

11 голосов
/ 20 декабря 2009

Эти методы позволяют сохранять и извлекать изображение из каталога документов на 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;
}
3 голосов
/ 22 февраля 2017

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")
}
2 голосов
/ 28 июня 2016

Проверенный код для 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)
}
2 голосов
/ 20 декабря 2009

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

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

1 голос
/ 04 февраля 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
}
0 голосов
/ 14 февраля 2018

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