【SwiftUI】画像(UIImage)をpngファイルとしてiPhoneに保存する
何の記事?
SwiftUIで写真を撮影するアプリを作っているのですが、カメラロールに保存された写真には名前を付けることができません。そこで、画像をiPhoneの本体に名前付きで保存できるようにします。
この記事の情報は次のバージョンで動作確認しています。
【Xcode】13.1
【Swift】5.5.1
【iOS】15.1
【macOS】Big OS Monterey 12.1
iosアプリのファイルシステム
iOSアプリは、システムが不正に操作されるのを防ぐ為、アクセスできるフォルダがアプリ毎に隔離されています。これをSandbox構造と呼びます。対象のフォルダは、端末からアプリを削除すると一緒に削除されます。
Mac本体とiPhoneとを接続すると、Finderからファイルシステムにアクセスすることができます。アプリごとにフォルダ分けされていることがわかります。
アプリにファイルを書き込みするためには
SavetoDoc
//private func saveToDoc (image: UIImage, fileName: String ) -> Bool{
public func SaveToDoc () -> Bool{
let pngImageData = UIImage.pngData(image)
//iPhone内ファイルシステムのURLを取得
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
//ファイル名をつなげる
let fileURL = documentsURL.appendingPathComponent("test.png")
//保存
do {
try pngImageData()!.write(to: fileURL)
print("SaveToDoc Done!")
} catch {
//エラー処理
return false
}
return true
}
権限の設定
//private func saveToDoc (image: UIImage, fileName: String ) -> Bool{
public func SaveToDoc () -> Bool{
let pngImageData = UIImage.pngData(image)
//iPhone内ファイルシステムのURLを取得
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
//ファイル名をつなげる
let fileURL = documentsURL.appendingPathComponent("test.png")
//保存
do {
try pngImageData()!.write(to: fileURL)
print("SaveToDoc Done!")
} catch {
//エラー処理
return false
}
return true
}
上記スクリプトによりエラーなく実行できますが、権限を設定しておかないとファイルシステム内にアプリのフォルダが作成されません。必要な設定は下の2つです。
・Supports opening documents in place
・Application supports iTunes file sharing
これらの設定後にアプリを起動させると、ファイルシステム内に新しいフォルダが作成されました。test.pngも無事に保存されていますね。
参考:
https://develop.hateblo.jp/entry/iosapp-uiimage-save
https://capibara1969.com/2836/
Author And Source
この問題について(【SwiftUI】画像(UIImage)をpngファイルとしてiPhoneに保存する), 我々は、より多くの情報をここで見つけました https://qiita.com/Radley/items/ec67ef133f7e86e6e41d著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .