前提・実現したいこと
SwiftでCoreDataに保存した画像を、撮影したカメラの向きのままImageViewに表示したいです。
発生している問題
画像をImageVIewに表示する際に、カメラ縦向きで保存された画像が左に90度回転してしまいます。
横向きの画像は横のまま表示されます。
###わからないこと
下記の通り、調べられる限りの方法を試しましたが解決できませんでした。使い方が間違っているのか、別の方法があるのかをご教授いただければと思います。
該当のソースコード
Swift
1import UIKit 2import CoreData 3 4class ViewController: UIViewController,UIImagePickerControllerDelegate, UINavigationControllerDelegate { 5 6 @IBOutlet weak var imageView: UIImageView! 7 @IBAction func actionSheet(_ sender: UIButton) { 8 9 let actionSheet = UIAlertController(title: "", message: "画像を選んでください", preferredStyle: UIAlertController.Style.actionSheet) 10 11 let tappedCamera = UIAlertAction(title: "カメラで撮影する", style: UIAlertAction.Style.default, handler: {(action: UIAlertAction!) in self.takePhotos() 12 }) 13 14 let tappedLibrary = UIAlertAction(title: "ライブラリから選択する", style: UIAlertAction.Style.default, handler: {(action: UIAlertAction!) in self.choosePhotos() 15 }) 16 17 let cancel = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler: {(action: UIAlertAction!) in print("キャンセル") 18 }) 19 20 actionSheet.addAction(tappedCamera) 21 actionSheet.addAction(tappedLibrary) 22 actionSheet.addAction(cancel) 23 24 present(actionSheet, animated: true, completion: nil) 25 } 26 27 func takePhotos() { 28 //画像の取得方法を設定 29 let camera = UIImagePickerController.SourceType.camera 30 31 if UIImagePickerController.isSourceTypeAvailable(camera){ 32 let picker = UIImagePickerController() 33 picker.sourceType = camera 34 picker.delegate = self 35 self.present(picker, animated: true, completion: nil) 36 } 37 } 38 39 func choosePhotos() { 40 let photoPick = UIImagePickerController() 41 photoPick.sourceType = .photoLibrary 42 photoPick.delegate = self 43 self.present(photoPick, animated: true, completion: nil) 44 } 45 46 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){ 47 48 let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage 49 self.imageView.image = image 50 51 //画像の保存 52 let photoCore = Photo(context: self.conText) 53 let imageData = UIImage.pngData(image) 54 photoCore.picture = imageData() 55 (UIApplication.shared.delegate as! AppDelegate).saveContext() 56 57 self.dismiss(animated: true, completion: nil) 58 } 59 60 var photo01:[Photo] = [] 61 var conText = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 62 63 override func viewDidLoad() { 64 super.viewDidLoad() 65 // Do any additional setup after loading the view. 66 67 //保存した画像の取り出し 68 let fetchRequest = NSFetchRequest<Photo>(entityName: "Photo") 69 do{ 70 photo01 = try conText.fetch(fetchRequest) 71 let image = photo01.last?.picture 72 73 if let validImage = image { 74 let imageData = UIImage(data: validImage) 75 self.imageView.image = imageData?.fixedOrientation() 76 }else{ 77 //処理なし 78 } 79 80 }catch{ 81 print(error) 82 } 83 } 84 85} 86 87//画像の向きを制御 88extension UIImage{ 89 func reSizeImage(size: CGSize) -> UIImage?{ 90 91 UIGraphicsBeginImageContextWithOptions(self.size, false, 0.0) 92 self.draw(in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)) 93 guard let image = UIGraphicsGetImageFromCurrentImageContext() else { 94 return nil 95 } 96 UIGraphicsEndImageContext() 97 98 let originalWidth = image.size.width 99 let originalHeight = image.size.height 100 101 var resizeWidth: CGFloat = 0 102 var resizeHeight: CGFloat = 0 103 104 if(originalWidth <= originalHeight){ 105 resizeWidth = size.width 106 resizeHeight = size.height 107 }else{ 108 resizeHeight = size.height 109 resizeWidth = originalWidth * resizeHeight / originalHeight 110 } 111 112 let resizeSize = CGSize(width: resizeWidth, height: resizeHeight) 113 UIGraphicsBeginImageContext(resizeSize) 114 115 image.draw(in: CGRect(x: 0, y: 0, width: resizeWidth, height: resizeHeight)) 116 117 let resizeImage = UIGraphicsGetImageFromCurrentImageContext() 118 UIGraphicsEndImageContext() 119 120 let cropRect = CGRect(x: (resizeWidth - size.width) / 2, y: (resizeHeight - size.height) / 2, width: size.width, height: size.height) 121 122 if let cropRef = resizeImage?.cgImage{ 123 if(resizeWidth > resizeHeight){ 124 cropRef.cropping(to: cropRect) 125 let cropImage = UIImage(cgImage: cropRef, scale: 0, orientation: .right) 126 return cropImage 127 }else{ 128 cropRef.cropping(to: cropRect) 129 let cropImage = UIImage(cgImage: cropRef) 130 return cropImage 131 } 132 }else{ 133 print("error") 134 return nil 135 } 136 } 137 138} 139
試したこと
・保存した画像を読み込む際にリサイズする方法を試しました。【swift】カメラで撮影した画像を用いた時に向きがを参考にしましたが、変化なしでした。
・上記コードのようにリサイズした画像の縦横を比べて、右に90度回転させる処理を考えました。しかし、横向きの画像も回転してしまうことに気づき、なしとしました。
・GitHubのコードがいくつかのサイトで使われていたので試しましたが、画像のorientationは.upになっているようで、変化なしでした。
補足情報(FW/ツールのバージョンなど)
Swift: version 5.1
Xcode: Version 11.1
Mac OS: Mojave 10.14.6
回答1件
あなたの回答
tips
プレビュー