[swift] 画像をデバイスのLibraryフォルダに保存
画像をデバイスのLibraryフォルダに保存するコードは以下の通り
pngImageData.writeでデータを書き込む場合のpathは「file://」がついていないとエラーとなるので注意。
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { // 選択されたセル情報を取得 let cell = self.tableView.cellForRow(at: indexPath) let imageView = cell?.contentView.viewWithTag(1) as! UIImageView //URL let fileURL = URL(string: "https://xxxxxxx/yyy.gif") //deletingPathExtensionで拡張子を削除し, lastPathComponentでファイル名を取得している。 let fileName:String = (fileURL?.deletingPathExtension().lastPathComponent)! saveImage(image: image, filename: fileName){(path: String) in //保存完了後のコードを記述 } } //画像を保存する関数 func saveImage(image: UIImage, filename : String ,completion: (_ path: String) -> Void) { //ドキュメントフォルダのパスを生成 let path = "file://"+fileInLibraryDirectory(filename: filename)+".png" let url:URL = NSURL(string: path)! as URL //pngで保存する場合 let pngImageData = UIImagePNGRepresentation(image) // jpgで保存する場合 //let jpgImageData = UIImageJPEGRepresentation(image, 1.0) //let result = pngImageData!.writeToFile(path, atomically: true) do { try pngImageData?.write(to: url, options: .atomic) completion(path) //完了後pathを保存したかったのでpathを返している } catch { print("saveImage error is \(error)") } } //MARK:Documents folderに保存する場合 func getDocumentsURL() -> NSURL { let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] return documentsURL as NSURL } func fileInDocumentsDirectory(filename: String) -> String { let fileURL = getDocumentsURL().appendingPathComponent(filename) return fileURL!.path } //MARK:Library folderに保存する場合 func getLibraryURL() -> NSURL { let libraryURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)[0] return libraryURL as NSURL } func fileInLibraryDirectory(filename: String) -> String { let folderName = "media" //mediaフォルダの有無を確認 createDirectory(foldername: folderName) let fileURL = getLibraryURL().appendingPathComponent("\(folderName)/\(filename)") return fileURL!.path } //MARK:Create Directory func createDirectory(foldername : String){ let fileManager = FileManager.default //Document folder上に作成するコード //let paths = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent(foldername) //Library folder上に作成するコード let paths = (NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent(foldername) if !fileManager.fileExists(atPath: paths){ try! fileManager.createDirectory(atPath: paths, withIntermediateDirectories: true, attributes: nil) }else{ print("Already dictionary created.") } }
保存した画像ファイルを読み込むには以下のコード
let fileManager = FileManager.default let imagePath = fileInLibraryDirectory(filename: person.value(forKeyPath: "filename") as! String) if fileManager.fileExists(atPath: imagePath){ //TableViewの場合 cell.imageView?.image = UIImage(contentsOfFile: imagePath) }else{ print("No Image") }