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

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

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

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

0回答

1183閲覧

swiftのUIImageViewをpng形式のデータに変換する方法が知りたい

yuuurii

総合スコア7

Swift

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

0グッド

0クリップ

投稿2020/08/02 05:47

編集2020/08/02 05:58

やりたいこと

swiftでUIImageViewに描画された画像をAWSS3にアップロードしたい

詰まっていること

以下の記事を参考にS3の設定を行った。
SwiftからS3に画像をアップロードする方法

swift

1import UIKit 2import AVFoundation 3import AWSS3 4 5class ViewController: UIViewController, 6 UINavigationControllerDelegate, 7 UIImagePickerControllerDelegate{ 8 //デバイスからの入力と出力を管理するオブジェクトの作成 9 var captureSession = AVCaptureSession() 10 11 //ラベルの設置 12 @IBOutlet weak var resultLabel: UILabel! 13 //画像の表示 14 @IBOutlet weak var cameraView: UIImageView! 15 16 // 撮影完了 17 func imagePickerController(_ imagePicker: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){ 18 // カメラから撮影したイメージを取得 19 if let image = info[.originalImage] as? UIImage { 20 cameraView.image = image 21 } 22 if let pngImage = image.pngData() { 23 uploadData(data: pngImage) // 追加 24 } 25 // カメラ画面を閉じる 26 imagePicker.dismiss(animated: true, completion: nil) 27 } 28 29 // アップロード 30 func uploadData(data: Data) { 31 let transferUtility = AWSS3TransferUtility.default() 32 let bucket = "バケット名" 33 let key = "ファイルパス" 34 let contentType = "image/png" 35 let expression = AWSS3TransferUtilityUploadExpression() 36 expression.progressBlock = {(task, progress) in 37 DispatchQueue.main.async { 38 } 39 } 40 41 let completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock? 42 completionHandler = { (task, error) -> Void in 43 DispatchQueue.main.async { 44 if let error = error { 45 print(error.localizedDescription) 46 } else { 47 } 48 } 49 } 50 51 transferUtility.uploadData( 52 data, 53 bucket: bucket, 54 key: key, 55 contentType: contentType, 56 expression: expression, 57 completionHandler: completionHandler 58 ).continueWith { (task) -> Any? in 59 if let error = task.error as NSError? { 60 print(error.localizedDescription) 61 } else {} 62 return nil 63 } 64 }

以下の記事を参考に
UIImageをNSDataに変換し、SwiftでUIImageに変換し直しますか?

swift

1if let image = info[.originalImage] as? UIImage { 2 cameraView.image = image 3} 4 5if let pngImage = image.pngData() { 6 uploadData(data: pngImage) 7}

次のように変換したら

if let image = info[.originalImage] as? UIImage { cameraView.image = image } let imageData: NSData = UIImagePNGRepresentation(image) uploadData(data: imageData)

NSDataに変換してくださいというエラーが来ました。
Use of unresolved identifier 'image'
'NSData' is not implicitly convertible to 'Data'; did you mean to use 'as' to explicitly convert?

UIImageDataに描画された画像をAWS s3にアップロードする良い方法を教えてください。
なるべく写真に保存せず、そのままアップロードする方法が知りたいです。

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

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

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

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

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

TsukubaDepot

2020/08/02 09:57

> Use of unresolved identifier 'image' このエラーが出る原因は、imageという名前の変数が定義されていないことが原因となります。 if let image = info[.originalImage] as? UIImage { cameraView.image = image } 上記のオプショナルバインディングで定義した image のスコープは、if文までとなり、そこから先では使うことができません。 なので、 let imageData: NSData = UIImagePNGRepresentation(image) 上記で引数として使っている image は未定義となってしまいます。 参考にされたページを見る限り、このような使い方はしていないので、再度見直してみられてはいかがでしょうか。
yuuurii

2020/08/02 15:24

> 参考にされたページを見る限り、このような使い方はしていないので、再度見直してみられてはいかがでしょうか。 ありがとうございます。以下のように変更したらエラーが消えました let image = info[.originalImage] as! UIImage cameraView.image = image if let pngImage = image.pngData() { uploadData(data: pngImage) } 追加で質問失礼します アップロードの開始はできたのですが、S3のアップロードが途中で失敗します。 The operation couldn’t be completed. (com.amazonaws.AWSS3TransferUtilityErrorDomain error 1.) Podフォルダ内のAWSCognitoとAWSS3でいくつか警告が出ているのですが、ここが原因なのでしょうか?? Cognitoの警告 'Cognito' is deprecated: Use `AWSAppSync` for data synchronization. S3の警告 Implementing deprecated class
TsukubaDepot

2020/08/03 00:44

私はAmazon系のライブラリは使ったことがないので分かりませんが、エラーメッセージから確実に言えることは、いずれのエラーも「ライブラリが既に非推奨(deprecated)となっている」ということかと思います。 なので、より最新版のライブラリを使うなど、全体的な変更が必要なのではないでしょうか。 いずれにせよ、ご質問のタイトル(swiftのUIImageViewをpng形式のデータに変換する方法が知りたい)とやりたいこと(PNGとしてAWSS3にアップロードしたい)が乖離していて適切ではないように思えますので、質問タイトルを変更し、ご質問の内容を調整されるか、あるいは一旦このご質問は自己解決か何かで閉じた上で、改めて適切なタイトル、内容でご質問されてはいかがでしょうか。
yuuurii

2020/08/05 13:52

タイトルと質問の内容が乖離してました。 TsukubaDepotさんのおかげでこの問題は解決できました。ありがとうございます
TsukubaDepot

2020/08/05 21:13

解決したようでよかったです。 このままだと未解決で残ってしまいますので、是非自己解決として閉じていただければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問