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

Posted

技术标签:

【中文标题】如何在我的应用程序中保存图像(路径)?【英文标题】:How to save an image (path) within my app? 【发布时间】:2015-01-21 11:57:30 【问题描述】:

我想制作一个应用程序,用户在其中填写某种表格,并在其中附加一张图片。用户从图库中选择一张图片(使用 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)


编辑

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

【问题讨论】:

你到底用了什么代码?我面临同样的问题?我喜欢将图像名称存储在核心数据中,并将图像放在同一个文件夹或类似文件夹中 【参考方案1】:

存储图像的好地方是文档目录。您可以保存到它,然后从中检索图像。我使用这些 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") 

【讨论】:

谢谢,但我猜你没有理解我的问题。假设图像已经保存,用户通过 UIImagePickerController 选择它。现在我如何获得该图像的路径?您的方法获取文件路径,但这正是我的问题所在 - 如何获取文件路径? 据我所知,您只能从imagePickerController(picker:, didFinishPickingMediaWithInfo info:)获取图像数据,因此您必须缓存图像然后检索它,因此您必须创建路径并且必须从路径中读取。 嗯,你知道我是怎么得到那条路的吗? (见我的代码没有路径的方式) 您将图像保存到您想要的任何路径,并且通过保存它,您现在有了对它的路径引用。 没有办法使用现有的副本吗?保存图像的另一个副本似乎有点浪费。【参考方案2】:

这是保存图像的方法

- (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)
    
  

要获得图像可以很容易地从同一个相关联

【讨论】:

我想你也没有理解我的问题。问题是“如何获取现有图像的路径?” - 我也很欣赏 Swift 代码。 :) 您对问题名称的看法是正确的。您的解决方案仍然不是我需要的,因为我不知道路径,而您的代码假定知道路径。 不知道图片路径怎么办?您自己会将图像保存到文档目录 .stringByAppendingPathComponent("Image2.png") 是图片存放的路径。下次您使用相同的代码保存另一个图像时,将替换较早的图像。因此,路径保持不变,但只要您保存新图像,图像就会发生变化。这就像我可以说的一样简单 谢谢,经过一番阅读,我明白我所要求的是不可能的。这使您的答案成为一个很好的答案。 :)

以上是关于如何在我的应用程序中保存图像(路径)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在html中设置img属性的绝对路径

如何检索照片库路径?

如何在我的应用程序中获取从 Whats 应用程序的聊天中选择的图像路径?

如何通过iphone中的sqlite获取路径来显示文档目录中保存的图像

如何使用 node.js 获取图像上传进度并在我的 iphone 应用程序中使用它

如何在我的应用程序中将图像标记为收藏