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