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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

受付中

CIImageをUIImageに変換すると、画像が90度傾いてしまう。

afuroda
afuroda

総合スコア36

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

2回答

0グッド

0クリップ

1584閲覧

投稿2021/08/25 17:07

前提・実現したいこと

カメラロールから取得した画像をciimageに変換した後に、画像処理を行って、uiimageに戻してuiimageviewに表示を行なった際に90度画像が回ってしまっており、この表示を回転しないようにしたいです。

該当のソースコード

swift

1 2var imageView = UIImageView() 3var image = UIImage() 4let imageOrientation = image.imageOrientation 5 6class ViewController: UIViewController, UIImagePickerControllerDelegate,UINavigationControllerDelegate { 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view. 11 makeButton() 12 makeImageView() 13 14 15 } 16 17func makeButton(){ 18 let button = UIButton() 19 button.frame = CGRect(x: 0, y: 0, width: x/2, height: y/5) 20 button.backgroundColor = UIColor.red 21 button.layer.masksToBounds = true 22 button.layer.cornerRadius = 30 23 button.layer.position = CGPoint(x: x/2, y: y*0.9) 24 button.addTarget(self, action: #selector(camera), for: .touchUpInside) 25 self.view.addSubview(button) 26 27 let sendBtn = UIButton() 28 sendBtn.frame = CGRect(x: 0, y: 0, width: x/2, height: y/5) 29 sendBtn.backgroundColor = UIColor.red 30 sendBtn.layer.masksToBounds = true 31 sendBtn.layer.cornerRadius = 30 32 sendBtn.layer.position = CGPoint(x: x/2, y: 0) 33 sendBtn.addTarget(self, action: #selector(detectText), for: .touchUpInside) 34 self.view.addSubview(sendBtn) 35 } 36 37 func makeImageView(){ 38 imageView.frame = CGRect(x: 0, y: 0, width: x/1.2, height: x/1.2) 39 imageView.layer.position = CGPoint(x: x/2, y: y/2) 40 imageView.contentMode = UIView.ContentMode.scaleAspectFit 41 self.view.addSubview(imageView) 42 } 43 44 45@objc func camera(){ 46 let imagePickerController = UIImagePickerController() 47 48 imagePickerController.sourceType = .photoLibrary 49 50 imagePickerController.delegate = self 51 52 self.present(imagePickerController,animated: true,completion: nil) 53 } 54 55func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 56 // 選択した写真を取得する 57 image = info[.originalImage] as! UIImage 58 59 let inputImage = CIImage(cgImage: image.cgImage!) 60 let myMonochromeFilter = CIFilter(name: "CIColorMonochrome") 61 myMonochromeFilter!.setValue(inputImage, forKey: kCIInputImageKey) 62 myMonochromeFilter!.setValue(CIColor(red: 0.5, green: 0.5, blue: 0.5), forKey: kCIInputColorKey) 63 myMonochromeFilter!.setValue(1.0, forKey: kCIInputIntensityKey) 64 let myOutputImage : CIImage = (myMonochromeFilter?.outputImage!)! 65 66 // ビューに表示する 67 imageView.image = UIImage(ciImage: myOutputImage, scale: image.scale, orientation: imageOrientation) 68 69 70 // 写真を選ぶビューを引っ込める 71 self.dismiss(animated: true) 72 } 73}

試したこと

ciImageをUIImageに再変換する際に、(https://qiita.com/YutoMizutani/items/de6c0f2200bdbab10624)を参考にorientationを設定しましたが、画像は90度回転したままでした。

補足情報(FW/ツールのバージョンなど)

Xcode 12.4 Swift5を使用しています。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

0

**UIImagePickerControllerから取得した画像のimageOrientation**を保持してCIImageからUIImageに変換する際に、渡してあげれば大丈夫だと思います。

Swift

1func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 2 // 選択した写真を取得する 3 image = info[.originalImage] as! UIImage 4 5 // 向き情報を保持する 6     let orientation = image.imageOrientation 7 8 let inputImage = CIImage(cgImage: image.cgImage!) 9 let myMonochromeFilter = CIFilter(name: "CIColorMonochrome") 10 myMonochromeFilter!.setValue(inputImage, forKey: kCIInputImageKey) 11 myMonochromeFilter!.setValue(CIColor(red: 0.5, green: 0.5, blue: 0.5), forKey: kCIInputColorKey) 12 myMonochromeFilter!.setValue(1.0, forKey: kCIInputIntensityKey) 13 let myOutputImage : CIImage = (myMonochromeFilter?.outputImage!)! 14 15 // ビューに表示する 16 // 保持したorientationを使う 17 imageView.image = UIImage(ciImage: myOutputImage, scale: image.scale, orientation: orientation) 18 19 20 // 写真を選ぶビューを引っ込める 21 self.dismiss(animated: true) 22 }

余談ですがグローバル変数はあまり好ましくないです。

投稿2021/08/27 07:15

編集2021/08/27 07:16
shiokara

総合スコア95

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

問題が 2 点あります。

まず、クラスの外に変数があるように見えますが、グローバル変数ってことでしょうか?
一般的にグローバル変数は避けるべきとされてますので、imageView は ViewController クラスのプロパティ (インスタンス変数)、image と imageOrientation は didFinishPickingMediaWithInfo メソッドのローカル変数にするのが良いと思います。

特に、imageOrientation はカメラロールから取得した画像の向きじゃないと意味がありません。

diff

1-var imageView = UIImageView() 2-var image = UIImage() 3-let imageOrientation = image.imageOrientation 4 5 class ViewController: UIViewController, UIImagePickerControllerDelegate,UINavigationControllerDelegate { 6 7+ var imageView = UIImageView() 8 9 // 略 10 11 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 12 // 選択した写真を取得する 13- image = info[.originalImage] as! UIImage 14+ let image = info[.originalImage] as! UIImage 15+ let imageOrientation = image.imageOrientation

次に、ビューに表示する部分ですが、どうやら CIImage から直接 UIImage に変換しても回転は無視されるようなので、いったん CGImage を経由する必要があるようです。

diff

1 // ビューに表示する 2- imageView.image = UIImage(ciImage: myOutputImage, scale: image.scale, orientation: imageOrientation) 3+ let cgImage: CGImage = CIContext().createCGImage(myOutputImage, from: myOutputImage.extent)! 4+ imageView.image = UIImage(cgImage: cgImage, scale: image.scale, orientation: imageOrientation)

投稿2021/08/27 02:31

hoshi-takanori

総合スコア7751

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。