2015-01-21 108 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

相關問題