如何在我的应用程序中保存图像(路径)?

How to save an image (path) within my app?

我想制作一个应用程序,用户可以在其中填写某种表格,并在其中附加一张图片。用户从图库中选择一张图片(使用 UIImagePickerController)。我已经知道如何使用 info[UIImagePickerControllerOriginalImage] as? UIImage.

在屏幕上显示图像

我想制作一个文件,下次打开应用程序时会用到,这样可以和笔记显示相同的图像。所以最好我想保存文件的路径,以便下次我只需使用 UIImage(contentsOfFile: path) 打开它。我怎样才能得到这条路?

到目前为止我有一些不太有趣的代码:

@IBAction func chooseFromGallery(sender: AnyObject) {
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.SavedPhotosAlbum){
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum;
        imagePicker.allowsEditing = false
        self.presentViewController(imagePicker, animated: true, completion: nil)
    }
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
    dismissViewControllerAnimated(true, completion: nil)
    
    self.image.image = info[UIImagePickerControllerOriginalImage] as? UIImage  // This works
    self.imagePath =  // What goes here?
    println(self.imagePath)
}

func imagePickerControllerDidCancel(picker: UIImagePickerController) {
    dismissViewControllerAnimated(true, completion: nil)
}

编辑

经过一番阅读,我发现无法获取保存在应用程序沙箱之外的图像的路径。所以每个人都在寻找同样的东西,停下来,使用 Bluehound 的答案。
有关如何在 iOS(和 OS X)中处理文件的更多信息,请阅读:https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html

这是保存图像的方法

- (IBAction)saveImage {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"];
UIImage *image = imageView.image; // imageView is where you are displaying image after selecting one from UIImagePicker
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:savedImagePath atomically:NO];

}

您可以像这样取回这张图片

- (IBAction)getImage {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *getImagePath = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"];
UIImage *img = [UIImage imageWithContentsOfFile:getImagePath];

}

更新:

我相信你的问题标题暗示有点不同。回到你的问题,如果你打算一直只使用一个图像,你可以有一个图像名称并使用它。这将始终覆盖之前保存的图像。

否则,另一种选择可能是创建一个简单的 plist 或 db,并使用图像和时间戳来唯一标识每个图像。

Swift 保存图像的代码:

let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
if let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) {
if paths.count > 0 {
    if let dirPath = paths[0] as? String {
        let image = ***YOUR IMAGE***
        let writePath = dirPath.stringByAppendingPathComponent("Image2.png") 
        UIImagePNGRepresentation(image).writeToFile(writePath, atomically: true)
    }
  }
}

获取图像可以很容易地从相同的图像关联起来

文档目录是存放图片的好地方。您可以保存到它,然后从中检索图像。我使用这些 UIImage 扩展来保存和检索图像:

extension UIImage {
func save(fileName: String, type: String) {
        let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String

        if type.lowercaseString == "png" {
            let path = "\(documentsPath)/\(fileName).\(type)"
            UIImagePNGRepresentation(self).writeToFile(path, atomically: true)
        } else if type.lowercaseString == "jpg" {
            let path = "\(documentsPath)/\(fileName).\(type)"
            UIImageJPEGRepresentation(self, 1.0).writeToFile(path, atomically: true)
        } else {

        }
    }

convenience init?(fileName: String, type: String) {
        let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
        let path = "\(documentsPath)\(fileName).\(type)"
        self.init(contentsOfFile: path)
    }
}

使用它,我可以使用一些数据存储方法(例如 Core Data)存储文件名而不是图像的整个路径。

使用:

someImage.save("SomeName" , type: "png")

if let image = UIImage(fileName: "SomeName", type: "png") {
}