2015-01-21 73 views
0

我想制作一个应用程序,用户填写某种表单并将图像附加到该应用程序。用户从图库中选取图片(使用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

+0

你到底用什么样的代码?我面临同样的问题?我喜欢将图像名称存储在核心数据中,并将图像放在同一个文件夹或类似的地方 – alex 2015-10-22 14:56:00

回答

4

一个良好的存储图像的相关文档目录。您可以保存到它,然后从中检索图像。我使用的保存和检索的图像这些的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) 
    } 
} 

利用这一点,我可以存储一个文件名,而不是使用一些数据存储方法,例如核心数据的图像的整个路径。

用途:

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

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

谢谢,但我想你不明白我的问题。假设图像已经保存,用户通过UIImagePickerController选择了它。现在我该如何获得该图像的路径?你的方法得到一个文件路径,但这正是我的问题所在 - 如何获取文件路径? – 2015-01-21 12:39:48

+0

据我所知,你只能从'imagePickerController(picker:,didFinishPickingMediaWithInfo info:)'获取图像数据,因此你必须缓存图像然后检索它,所以你必须创建路径,并且你必须从路径中读取。 – Ian 2015-01-21 12:45:31

+0

那么,你知道我是如何得到这条路吗? (请参阅我的代码,了解没有路径的方法) – 2015-01-21 13:39:23

0

这里是如何保存你的图像

- (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,并使用图像和时间戳来唯一标识每个图像。

斯威夫特代码来保存图片:

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

以获取图像可以很easliy来自同一

+0

我想你也不理解我的问题。问题是“我如何获得现有图像的路径?” - 另外我会感谢斯威夫特代码。 :) – 2015-01-21 12:19:26

+0

你是对的问题的名称。仍然你的解决方案不是我所需要的,因为我不知道路径,而你的代码假设知道路径。 – 2015-01-21 13:42:54

+0

它是如何不知道图像的路径?你自己会将图像保存到文档目录 – 2015-01-21 16:07:35

相关问题