やりたいこと
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にアップロードする良い方法を教えてください。
なるべく写真に保存せず、そのままアップロードする方法が知りたいです。
> Use of unresolved identifier 'image'
このエラーが出る原因は、imageという名前の変数が定義されていないことが原因となります。
if let image = info[.originalImage] as? UIImage {
cameraView.image = image
}
上記のオプショナルバインディングで定義した image のスコープは、if文までとなり、そこから先では使うことができません。
なので、
let imageData: NSData = UIImagePNGRepresentation(image)
上記で引数として使っている image は未定義となってしまいます。
参考にされたページを見る限り、このような使い方はしていないので、再度見直してみられてはいかがでしょうか。
> 参考にされたページを見る限り、このような使い方はしていないので、再度見直してみられてはいかがでしょうか。
ありがとうございます。以下のように変更したらエラーが消えました
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
私はAmazon系のライブラリは使ったことがないので分かりませんが、エラーメッセージから確実に言えることは、いずれのエラーも「ライブラリが既に非推奨(deprecated)となっている」ということかと思います。
なので、より最新版のライブラリを使うなど、全体的な変更が必要なのではないでしょうか。
いずれにせよ、ご質問のタイトル(swiftのUIImageViewをpng形式のデータに変換する方法が知りたい)とやりたいこと(PNGとしてAWSS3にアップロードしたい)が乖離していて適切ではないように思えますので、質問タイトルを変更し、ご質問の内容を調整されるか、あるいは一旦このご質問は自己解決か何かで閉じた上で、改めて適切なタイトル、内容でご質問されてはいかがでしょうか。
タイトルと質問の内容が乖離してました。
TsukubaDepotさんのおかげでこの問題は解決できました。ありがとうございます
解決したようでよかったです。
このままだと未解決で残ってしまいますので、是非自己解決として閉じていただければと思います。
あなたの回答
tips
プレビュー