2017-07-04 102 views
1

我有一个UIImage阵列,我试图保存到磁盘(文档目录)。我已将其转换为Data,因此可以保存,但我无法弄清正确/最佳方式将[Data]保存到磁盘保存UIImage阵列到磁盘

(arrayData as NSArray).write(to: filename, atomically: false)似乎不正确或似乎有一些更好的方法。

到目前为止的代码:

// Get the new UIImage 
    let image4 = chartView.snapShot() 

    // Make UIImage into Data to save 
    let data = UIImagePNGRepresentation(image4!) 

    // Add Data image to Data Array 
    arrayData.append(data!) 

    // Get Disk/Folder 
    let filename = getDocumentsDirectory().appendingPathComponent("images") 

    // This is how I'd Write Data image to Disk 
    // try? data?.write(to: filename) 

    // TODO: Write array Data images to Disk 
    (arrayData as NSArray).write(to: filename, atomically: false) 
+1

让一切:NSMutableArray的= arrayData作为! NSMutableArray whatever.write(toFile:filename,atomically:true) –

回答

1

要将图像保存到文档目录,您可以从创建保存图像的函数开始,如下所示。该函数处理为您创建图像名称并将其返回。

func saveImage(image: UIImage) -> String { 

    let imageData = NSData(data: UIImagePNGRepresentation(image)!) 
    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) 
    let docs = paths[0] as NSString 
    let uuid = NSUUID().uuidString + ".png" 
    let fullPath = docs.appendingPathComponent(uuid) 
    _ = imageData.write(toFile: fullPath, atomically: true) 
    return uuid 

    } 

现在,因为要保存图像的数组,你可以简单地循环,并调用saveImage功能:

for image in images { 
     saveImage(image: image) 
    } 

如果您希望自己命名这些图像,你可以修改的第一个函数以下几点:

func saveImage(image: UIImage, withName name: String) { 

let imageData = NSData(data: UIImagePNGRepresentation(image)!) 
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) 
let docs = paths[0] as NSString 
let name = name 
let fullPath = docs.appendingPathComponent(name) 
_ = imageData.write(toFile: fullPath, atomically: true) 
} 

当您将图像保存为UIImagePNGRepresentation你正在尝试做的,请注意,是不保存的方向你。这意味着当您尝试检索图像时,可能会标题为左侧。您需要重新绘制图片以确保它的方向正确,因为这篇文章将解释how to save png correctly。但是,如果使用UIImageJPEGRepresentation保存图像,则不必担心所有这些,只需保存图像即可,无需额外工作。

编辑以GIVE IMAGES

要获取已保存的图像,可以使用下面的函数,你传递图像名称的数组的数组,你会得到一个数组回来:

func getImage(imageNames: [String]) -> [UIImage] { 

    var savedImages: [UIImage] = [UIImage]() 

    for imageName in imageNames { 

    if let imagePath = getFilePath(fileName: imageName) { 
     savedImage.append(UIImage(contentsOfFile: imagePath)) 
    } 

    } 

    return savedImages 

    } 

依赖于该功能的工作:

func getFilePath(fileName: String) -> String? { 

    let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory 
    let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask 
    var filePath: String? 
    let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) 
    if paths.count > 0 { 
    let dirPath = paths[0] as NSString 
    filePath = dirPath.appendingPathComponent(fileName) 
    } 
    else { 
    filePath = nil 
    } 

    return filePath 
    } 
+0

标记了你的答案,但我没有看到你展示了如何检索数组,我只看到你将能够检索1个图像? – SRMR

+0

我认为这个问题是关于如何保存图像的基础上,你强调了“正确/最好的方式来保存[数据]到磁盘”。如果你不知道如何,我只会添加检索部分。但不用担心,我已经修改了答案,通过传递一组图像名称并获取您保存的图像数组来帮助您获取图像。希望这可以帮助。 – gwinyai

+1

让我知道,如果一切正常。 – gwinyai

1

您可以在下面的代码来存储的图像到本地。

let fileManager = NSFileManager.defaultManager() 
    let paths = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString).stringByAppendingPathComponent("ImageName.png") 
    let image = YOUR_IMAGE_TO_STORE. 
    let imageData = UIImageJPEGRepresentation(image!, 0.5) 
    fileManager.createFileAtPath(paths as String, contents: imageData, attributes: nil) 
+0

感谢您的回应!从你的代码看来,你只是在存储一个图像,而不是一系列图像。你知道如何存储一组图像吗? – SRMR

+0

你可以使用循环。 – Nirmalsinh