Swift 将图像(截图)保存到 nsuserdefaults

Posted

技术标签:

【中文标题】Swift 将图像(截图)保存到 nsuserdefaults【英文标题】:Swift Save images (screenshots) to nsuserdefaults 【发布时间】:2015-08-09 14:23:17 【问题描述】:

我有一个程序,用户“创建”一个图像,然后程序会截取屏幕截图。然后我想将此屏幕截图保存到数据库中,最好是 nsuserdefaults,因为我稍后会在表格视图中访问它。任何其他关于如何解决这个问题的建议都非常受欢迎:)

代码是这样的

let screenshot = getScreenshot() // saves the screenshot
var imagePaths = [String]()
// get the array of previous screenshots
if let _ = NSUserDefaults.standardUserDefaults().objectForKey(theKey)

   imagePaths = NSUserDefaults.standardDefaults().objectForKey(theKey) as! [String]   

// then I want to get a path to the image something like
let imagePath = screenshot.getPath() // although this is not a valid method, this is basically what I want
// add the imagePath
imagePaths.append(imagePath)
// finally I save the image
NSUserDefaults.standardUserDefaults().setObject(imagePaths, forKey: theKey)

【问题讨论】:

您要将实际图像(NSData)还是图像的路径(NSString)存储到用户默认值? 这个没关系,我只需要稍后显示图像,s 【参考方案1】:

您可以在Documents 中创建目录,并将屏幕截图作为普通文件保存在那里。文件名可以从日期和时间生成唯一性。

func saveImage(imageData: NSData)

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "dd-MM-yyyy hh.mm.ss"
    let filename = "\(dateFormatter.stringFromDate(NSDate())).png"

    let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
    let imagesDirectory = documentsDirectory.stringByAppendingPathComponent("Images")
    let filePath = imagesDirectory.stringByAppendingPathComponent(filename)

    if !NSFileManager.defaultManager().fileExistsAtPath(imagesDirectory)
    
        var error: NSError?

        NSFileManager.defaultManager().createDirectoryAtPath(imagesDirectory, withIntermediateDirectories: false, attributes: nil, error: &error)

        if error != nil
        
            println("\(error!.localizedDescription)")
            return
        
    

    imageData.writeToFile(filePath, atomically: true)


func getImagesPaths() -> [String]?

    let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
    let imagesDirectory = documentsDirectory.stringByAppendingPathComponent("Images")

    if let filenames = NSFileManager.defaultManager().contentsOfDirectoryAtPath(imagesDirectory, error: nil)
    
        let imagePaths = filenames.map"\(imagesDirectory)/\($0)".filter()$0.pathExtension == "png"
        return imagePaths.count > 0 ? imagePaths : nil
    
    return nil

要保存图像,只需使用saveImage(data)。要获取图像路径,请使用getImagesPaths()

如果需要UIImage的数组,可以通过以下方式获取:

var images : [UIImage] = [ ]
if let imagePaths = getImagesPaths()

    for path in imagePaths
    
        if let image = UIImage(contentsOfFile: path)
        
            images.append(image)
        
    

【讨论】:

我试过了,一切正常,除了当我关闭应用程序并尝试查看保存的图像是否仍然存在时,我得到了 nilpointerexception,这是我尝试访问图像的方式if let _ = NSUserDefaults.standardUserDefaults().objectForKey(haikuKey) let rawData = NSUserDefaults.standardUserDefaults().objectForKey(haikuKey) as! [String] for rawImageData in rawData images.append(UIImage(named: rawImageData)!) 上面的代码并没有将图像数据存储在用户默认值中,而只存储图像文件的路径。您需要使用从这些路径加载的数据初始化您的 UIImages。 我该怎么做呢? @DavidWolters if let imagesPaths = NSUserDefaults.standardUserDefaults().objectForKey(haikuKey) as? [String] for path in imagesPaths images.append(UIImage(contentsOfFile: path)) 我收到错误fatal error: unexpectedly found nil while unwrapping an Optional value (lldb) 我直接复制了你的代码

以上是关于Swift 将图像(截图)保存到 nsuserdefaults的主要内容,如果未能解决你的问题,请参考以下文章

如何将iphone屏幕截图保存为jpeg图像?

将屏幕截图保存到CoreData

如何将一些图像作为一个图像保存到swift中的照片库?

将图像从 URL 保存到库,重命名并使用 Swift 共享它

swift3.0 屏幕截图并且保存到本地相册

使用多个 CALayers 捕获 UIVIew 的屏幕截图显示白色背景,同时将图像保存在图库中