質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2112閲覧

画像パスを取得してRealmに保存したい

sunglass

総合スコア303

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/05/11 05:58

編集2020/05/11 06:33

Realmにid, userName, userImageを保存したいです。
idとuserNameは保存できたので画像に挑戦しています。

やりたい事

  • 画像パスを取得して『画像パス』をRealmに保存したい
  • その画像パスを使ってuserImageに表示したい

出来たこと

  • 指定のImageViewをタップするとアルバムが起動
  • アルバムの中から画像を選択
  • アプリ内に表示

このアプリ内に表示した画像パスを取得してRealmに追加したいです。
そもそも可能なのでしょうか?また正しいやり方なのでしょうか。

詳しい方よろしくお願いします。

ViewController

1 2... 3 4@IBOutlet weak var userImage: UIImageView! 5 6override func viewDidLoad() { 7 super.viewDidLoad() 8 9 //ImageViewタップ認識ON 10 userImage.isUserInteractionEnabled = true 11 12.... 13 14@IBAction func imageTapGesture(_ sender: Any) { 15 16 changeImage() 17 } 18 19// 画像パス関連(テスト) 20 // DocumentディレクトリのfileURL取得 21 func getDocumentsURL() -> NSURL { 22 let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL 23 return documentsURL 24 } 25 26 // ディレクトリのパスにファイル名をつなげてファイルのフルパスを作る 27 func fileInDocumentsDirectory(filename: String) -> String { 28 let fileURL = getDocumentsURL().appendingPathComponent(filename) 29 30 print(fileURL) 31 return fileURL!.path 32 } 33 34 func changeImage() { 35 36 let sourceType:UIImagePickerController.SourceType = UIImagePickerController.SourceType.photoLibrary 37 38 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){ 39 40 let cameraPicker = UIImagePickerController() 41 cameraPicker.sourceType = sourceType 42 cameraPicker.delegate = self 43 44 self.present(cameraPicker, animated: true, completion: nil) 45 } 46 } 47 48 //アルバム画面で写真を選択した時 49 func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 50 / 51 if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { 52 53 self.userImage.image = image 54 55 self.dismiss(animated: true, completion: nil) 56 } 57 } 58

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sunglass

2020/05/11 09:29

コメントありがとうございます。 カメラ撮影→保存の機能は実装せず アルバム内の画像のみアップロードする仕様を希望しております。 https://teratail.com/questions/248877の回答の追記にある 『...これで取れるのは画像の実態があるfile保存先URLだったのでちょっと違った。』の方を実装がしたいです。。
TsukubaDepot

2020/05/11 10:38

その実装は最初に私がコメントしたURLのうち二番目になると思いますのでご確認ください。
sunglass

2020/05/13 07:22

developer.apple.comの方ダウンロードしたのですがBuildできませんでした、、
guest

回答1

0

ベストアンサー

コメントにいただいているように Photos.framework を使えばできると思います。
流れとして以下のような感じになると思います。

  1. UIImagePickerController で選択した画像から PHAsset を取得
  2. 取得した PHAsset から保存先のURLを取得
  3. 保存先のURLをRealmに保存

なお PHAsset を取得するためには画像ライブラリへのアクセスが許可されていないといけないので、
info.plist に Privacy - Photo Library Usage Description の追加とアクセスの許可を要求する必要があります。(参考)

Swift

1 switch PHPhotoLibrary.authorizationStatus() { 2 case .notDetermined: 3 PHPhotoLibrary.requestAuthorization { (status) in 4 switch status { 5 case .authorized: 6 print("Authorized") 7 default: 8 print("Other") 9 } 10 } 11 default: 12 break 13 }

UIImagePickerController から画像を選択する部分は既に実装されているので、
その中に PHAsset の取得と、PHAsset からURLを取得する処理を追加します。

Swift

1 //アルバム画面で写真を選択した時 2 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 3 // defer はブロックを抜ける時に defer 内の処理が実行されます 4 defer { 5 picker.dismiss(animated: true, completion: nil) 6 } 7 8 // 選択した画像から PHAsset を取得 9 // 画像ライブラリへのアクセスが許可されていない場合は nil が返ってきます 10 guard let phAsset = info[.phAsset] as? PHAsset else { return } 11 12 let options = PHContentEditingInputRequestOptions() 13 phAsset.requestContentEditingInput(with: options) { (input, info) in 14 // fullSizeImageURL に選択した画像のURLが入っているのでアンラップします 15 guard let url = input?.fullSizeImageURL else { return } 16 17 // これを Realm に保存するなりしてください 18 // Realm だと URL は保存できないと思うので、Stringに変換するといいかもしれないです 19 print(url.absoluteString) 20 } 21 }

これで画像が保存されているURLは取得できたので、あとは任意のタイミングで保存するなりするだけです。
ちなみにこの画像を表示するにはURLから Data のオブジェクトを生成、そこから UIImage を生成みたいな処理が必要になると思うので注意してください。

Swift

1 let urlString = /*Realmから読み込んだURLのStringだと思ってください*/ 2 let url = URL(string: urlString) { 3 do { 4 let data = try Data(contentsOf: url) 5 6 guard let image = UIImage(data: data) else { return } 7 imageView.image = image 8 } catch { 9 print(error) 10 } 11 }

投稿2020/05/16 05:18

hayabusabusash

総合スコア767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sunglass

2020/05/16 12:54

丁寧にありがとうございます。 お陰様でURL取得出来ました。 (詳細な説明本当にありがとうございます!画像表示はURLからData型に変換しないとダメなんですね。挑戦してみます。またわからないことが出てきたら質問投稿します。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問