如何在我的应用程序中保存图像(路径)?
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)
编辑
经过阅读后,我发现无法获取保存在应用程序沙箱之外的图像的路径。所以每个人都在寻找同样的东西,停下来,使用Bluehound
s 的答案。
有关如何在 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")
是图片存放的路径。下次您使用相同的代码保存另一个图像时,将替换较早的图像。因此,路径保持不变,但只要您保存新图像,图像就会发生变化。这就像我可以说的一样简单
谢谢,经过一番阅读,我明白我所要求的是不可能的。这使您的答案成为一个很好的答案。 :)以上是关于如何在我的应用程序中保存图像(路径)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的应用程序中获取从 Whats 应用程序的聊天中选择的图像路径?
如何通过iphone中的sqlite获取路径来显示文档目录中保存的图像