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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です