タブレット用プログラムの書き止め

android OS & iPadOS の記録。

【Swift P4.5.1】画像ファイルをUIImageデータに変換して表示する(2)

2024-09-19 00:06:57 | Swift iPadOS用

PhotosPickerは、標準の写真アプリで表示されてる画像の選択だけで、USBメモリストレージの画像は選択できない。
fileImporterは、標準のファイルアプリで表示されてるファイル(画像含む)の選択だけで写真アプリの画像は選択できない。
USBメモリの画像ファイルは選択できる。

この2つは設定が楽なので、両方読み込みたかったら2つのボタンで対応するのかな。


fileImporterで画像ファイルを読み込んで表示する方法がハッキリしたので記録する。
USBメモリストレージ内の画像ファイルも表示できた。

【MyApp.swift】
import SwiftUI

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}


【ContentView.swift】
import SwiftUI

struct ContentView: View {
    @State private var showSwitch = false
    @State var selectedImage: UIImage?

    var body: some View {
        VStack {
            Button("fileImporter") {
                showSwitch.toggle()
            }

            if selectedImage != nil {
                Image(uiImage: selectedImage!)
                    .resizable()
                    .scaledToFit()
            }
        }
        .fileImporter(isPresented: $showSwitch,
                      allowedContentTypes: [.jpeg,.png],
                      allowsMultipleSelection: false // 一つだけ選択
        ) { result in
            switch result {
            case .success(let urls):
                guard let fileurl = urls.first else {return}
                // アクセス権取得
                guard fileurl.startAccessingSecurityScopedResource() else { return }
                do {
                    // ファイルの内容を取得する
                    let data = try? Data(contentsOf: fileurl) // ファイルからバイナリデータを読み込む
                    selectedImage = UIImage(data: data!)  // UIImage型に変換
                } catch {
                    print(error.localizedDescription)
                }
                // アクセス権解放
                fileurl.stopAccessingSecurityScopedResource()
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
        onCancellation: {
            print("cancell success")
        }
    }
}


PhotosPicker も fileImporter もバイナリデータで読み込みUIImage型に変換してImage()に渡せば表示できる。
結構シンプルだった。変換と渡し方がハッキリしてなかった。

 

Web記事は、テキストファイル読み書きの説明ばっかりで...。はぁ~^^;