2017-07-04 101 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